PCA

Tutoriais https://www.datacamp.com/tutorial/pca-analysis-r https://rpkgs.datanovia.com/factoextra/index.html http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/114-mca-multiple-correspondence-analysis-in-r-essentials/ https://statisticsglobe.com/pca-before-k-means-clustering-r>

Bibliotecas

library(factoextra)
library(caret)
Loading required package: lattice

Attaching package: ‘lattice’

The following object is masked from ‘package:clusterProfiler’:

    dotplot


Attaching package: ‘caret’

The following object is masked from ‘package:purrr’:

    lift
library(stats)
library(ggfortify)
library(ggplot2)

DESeq2 results

# Criar um PCA com o p-valor de cada gene 
pca_data <- prcomp(t(assay(dds)))  # Perform PCA on the transposed count or normalized data

# Create a dataframe with PCA components and Timepointf and FirstSecondDosef
pca_df <- data.frame(PC1 = pca_data$x[, 1], PC2 = pca_data$x[, 2],
                     Timepoint = colData(dds)$Timepoint,
                    Vaccines = colData(dds)$Vaccine)

# Plot the PCA using ggplot2
ggplot(pca_df, aes(x = PC1, y = PC2, color = Vaccines, shape = Timepoint)) +
  geom_point(size = 3) +
  labs(title = "Principal component analysis - Vaccine-Timepoint", x = "PC1", y = "PC2") +
  theme_minimal()

#DESeq2 native analysis
vsd <- vst(dds, blind=FALSE)
pcaData = plotPCA(vsd,intgroup=c("Timepoint", "Vaccine"), returnData = TRUE)
percentVar <- round(100 * attr(pcaData, "percentVar"))

pca_plot = ggplot(pcaData, aes(PC1, PC2, color=Vaccine, shape=Timepoint)) +
  geom_point(size=2) +
  xlab(paste0("PC1: ",percentVar[1],"% variance")) +
  ylab(paste0("PC2: ",percentVar[2],"% variance")) + 
  coord_fixed() + ggtitle("Principal component analysis - Vaccines and Timepoint")

ggsave(pca_plot, file = "GSE206023_PCA.png")

PCA By sample

By genes

Padronizar

install.packages("janitor")
library(janitor)

#Inputs
degs_allstudies_updown = degs_allstudies_updown_filter %>% 
  select(-ends_with(".y")) %>% 
  rename_all(~sub("\\.x$", "", .)) %>%
  clean_names() %>% 
  rename(lfcse = lfc_se,
         l2fc = log2fold_change) %>% 
  select(- set_size_intervals) %>% 
  group_by(study) %>% 
  select(vaccine, study, gse_id, genes, process, gene_set_short, immune_system, immune_sub_system, immune_tissue, go_term, set_size, everything(), filter) %>% 
  mutate(study = ifelse(study == "ChAd (V2, D2)", "ChAd (V2, D3)", study)) %>% 
  distinct() %>% 
  filter(filter == "p<0.05")

#Salvar
write.csv(degs_allstudies_updown, file = "ImmuneGO_degs_allstudies_updown_filter_p005.csv")

Separar processos imunológicos em objetos

############## Innate
Immune_GO_innate = ImmuneGO_Annotated_Genes %>%  #250 genes (SetSize)
  filter(process == "INNATE IMMUNE RESPONSE" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_Complement = degs_allstudies_updown %>% #27 genes (SetSize)
  filter(process == "COMPLEMENT ACTIVATION" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_innate_Inflammatory = degs_allstudies_updown %>% #14 genes (SetSize)
  filter(process == "INFLAMMATORY RESPONSE TO ANTIGENIC STIMULUS" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_innate_DendriticCells = degs_allstudies_updown %>% #11 genes (SetSize)
  filter(process %in% c("DENDRITIC CELL CHEMOTAXIS", 
                        "DENDRITIC CELL HOMEOSTASIS", 
                        "DENDRITIC CELL MIGRATION", 
                        "MYELOID DENDRITIC CELL ACTIVATION", 
                        "MYELOID DENDRITIC CELL CHEMOTAXIS", 
                        "MYELOID DENDRITIC CELL DIFFERENTIATION", 
                        "PLASMACYTOID DENDRITIC CELL ACTIVATION", 
                        "PLASMACYTOID DENDRITIC CELL DIFFERENTIATION") & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))


Immune_GO_innate_Macrophages = degs_allstudies_updown %>% 
  filter(process %in% c("MACROPHAGE ACTIVATION", 
                        "MACROPHAGE ACTIVATION INVOLVED IN IMMUNE RESPONSE", 
                        "MACROPHAGE CHEMOTAXIS", 
                        "MACROPHAGE HOMEOSTASIS",
                        "MACROPHAGE MIGRATION") & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_innate_APP = degs_allstudies_updown %>% #21 genes (SetSize)
  filter(process == "ANTIGEN PROCESSING AND PRESENTATION" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_innate_TLR = degs_allstudies_updown %>% #14 genes (SetSize)
  filter(process == "TOLL-LIKE RECEPTOR SIGNALING PATHWAY" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

Immune_GO_innate_PRR = degs_allstudies_updown %>% #8 genes (SetSize)
  filter(process == "PATTERN RECOGNITION RECEPTOR SIGNALING PATHWAY" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))
Immune_GO_innate_CPR = degs_allstudies_updown %>% #6 genes (SetSize)
  filter(process == "CYTOSOLIC PATTERN RECOGNITION RECEPTOR SIGNALING PATHWAY" & 
         ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
          (gse_id == "GSE206023" & pvalue <= 0.05)))

############## Adaptive
Immune_GO_adaptive = degs_allstudies_updown %>% #330 genes (SetSize)
  filter(process == "ADAPTIVE IMMUNE RESPONSE" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

#Humoral
Immune_GO_adaptive_humoral = degs_allstudies_updown %>% #27 genes (SetSize)
  filter(process == "HUMORAL ADAPTIVE IMMUNE SYSTEM" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adap_IgMediated = degs_allstudies_updown %>% #62 genes (SetSize)
  filter(process == "IMMUNOGLOBULIN MEDIATED IMMUNE RESPONSE" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adap_Breceptorsig = degs_allstudies_updown %>% #31 genes (SetSize)
  filter(process == "B CELL RECEPTOR SIGNALING PATHWAY" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adap_Bactivation = degs_allstudies_updown %>% #36 genes
  filter(process == "B CELL ACTIVATION" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

#Cellular

Immune_GO_adaptive_cellular = degs_allstudies_updown %>% #41 genes
  filter(process == "CELLULAR ADAPTIVE IMMUNE SYSTEM" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adaptive_cellular_tcellactivation = degs_allstudies_updown %>% #41 genes
  filter(process == "T CELL ACTIVATION" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adaptive_cellular_treceptor = degs_allstudies_updown %>% #78 genes
  filter(process == "T CELL RECEPTOR SIGNALING PATHWAY" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adaptive_cellular_th1 = degs_allstudies_updown %>% #6 genes
  filter(process == "T-HELPER 1 TYPE IMMUNE RESPONSE" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adaptive_cellular_th2 = degs_allstudies_updown %>% #5 genes
  filter(process == "TYPE 2 IMMUNE RESPONSE" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))

Immune_GO_adaptive_cellular_th17 = degs_allstudies_updown %>% #3 genes
  filter(process == "T-HELPER 17 TYPE IMMUNE RESPONSE" &
    ((gse_id %in% c("GSE199750", "GSE201533") & padj <= 0.05) |
    (gse_id == "GSE206023" & pvalue <= 0.05)) &
    !(gse_id %in% c("GSE201533")))



ImmuneGO_Genes_interest = bind_rows(
  Immune_GO_general_innate,
  Immune_GO_general_Complement,
  Immune_GO_innate_Inflammatory,
  Immune_GO_innate_Macrophages,
  Immune_GO_innate_DendriticCells,
  Immune_GO_innate_APP,
  Immune_GO_innate_TLR,
  Immune_GO_innate_PRR,
  Immune_GO_innate_CPR,
  Immune_GO_adaptive,
  Immune_GO_adaptive_humoral,
  Immune_GO_adap_IgMediated,
  Immune_GO_adap_Breceptorsig,
  Immune_GO_adap_Bactivation,
  Immune_GO_adaptive_cellular,
  Immune_GO_adaptive_cellular_tcellactivation,
  Immune_GO_adaptive_cellular_treceptor,
  Immune_GO_adaptive_cellular_th1,
  Immune_GO_adaptive_cellular_th2,
  Immune_GO_adaptive_cellular_th17)

write.csv(ImmuneGO_Genes_interest, file = "ImmuneGO_Genes_interest_bystudy.csv")

Processar dados

# Immune_GO_general_innate
# Immune_GO_adaptive

Immune_GO_general_Complement
Immune_GO_innate_Macrophages
Immune_GO_innate_DendriticCells
Immune_GO_innate_Inflammatory
Immune_GO_innate_APP
Immune_GO_innate_TLR #Não usar
Immune_GO_innate_PRR #(SIGNALING PATHWAY)
Immune_GO_innate_CPR #Não usar
Immune_GO_adaptive_humoral
Immune_GO_adap_IgMediated
Immune_GO_adap_Breceptorsig
Immune_GO_adap_Bactivation
Immune_GO_adaptive_cellular
Immune_GO_adaptive_cellular_tcellactivation
Immune_GO_adaptive_cellular_treceptor


#INPUT
data_genes = Immune_GO_adaptive
filename = "Immune_GO_adaptive"

PCA

#Converter de long para wide
matrix_genes = data_genes %>% 
  select(study, genes, l2fc) %>%  
  dcast(`study` ~ `genes`, 
        value.var = "l2fc", 
        fun.aggregate = mean) %>% 
  as.data.frame() %>% 
  column_to_rownames(var = "study") %>% 
  replace(is.na(.), 0)

matrix_data_pca = matrix_genes %>% 
  rownames_to_column(var = "Condition")

matrix_data_pca_ready = matrix_data_pca %>% 
  column_to_rownames(var = "Condition")

ann_vaccines_pca_matrix = ann_vaccines_pca %>% 
  merge(matrix_data_pca, 
        by.x = "Condition", 
        all.x = F, 
        all.y = F) %>% 
  select(Condition:Efficacy)

# Verifique quais colunas têm variância muito baixa
nearZeroVarCols <- nearZeroVar(matrix_data_pca_ready, saveMetrics = TRUE)
matrix_data_pca_ready <- matrix_data_pca_ready[, !nearZeroVarCols$nzv]
pca_res <- prcomp(matrix_data_pca_ready, scale. = TRUE)

# Crie o gráfico de PCA
pca_plot_ann = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'Vaccine', 
                    label = 1) + #1: display, 0: hide
  labs(title=filename) +
  theme_classic()
  # scale_color_manual(values = c(BBIBP = "#black", 
  #                               ZF2001 = "black",
  #                               BNT = "#56cfe1",
  #                               ChAd = "#80ffdb" ,
  #                               "ChAd-BNT" = "#72efdd")) 

pca_plot_not_ann = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'Vaccine', 
                    label = 0) + #1: display, 0: hide
  labs(title=filename) +
  theme_classic() +
  stat_ellipse(type = "t")

#Salvar
ggsave(pca_plot_not_ann, filename = paste0(filename, "_PCA_not-ann.png"), width = 10, height = 8)
ggsave(pca_plot_ann, filename = paste0(filename, "_PCA_ann.png"), width = 10, height = 8)

# Exiba o gráfico
print(pca_plot_ann)
print(pca_plot_not_ann)

############### KNN classification

#Determinar o número de clusters para KNN
pca_scores <- data.frame(pca_res$x[, 1:2])
ggp1 <- fviz_nbclust(pca_scores,  
                     FUNcluster = kmeans,
                     method = "wss")

ggp1 

set.seed(123)                             # Set seed for randomization
kmeans_clust <- kmeans(pca_scores,        # Perform k-means clustering
                        centers = 4) # Definir numero de clusters

#Visualizar clusters
ggp2 <- fviz_pca_ind(pca_res,
                   habillage = kmeans_clust$cluster,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "convex",
                   labelsize = 2) +
     guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "KNN_Clustered.png"))

print(ggp2)
ggsave(ggp2, file = paste0(filename, "KNN_Clustered.png"), width = 5, height = 4)

#Colorido
fviz_pca_var(data.pca, col.var = "cos2",
            gradient.cols = c("black", "orange", "green"),
            repel = TRUE)
#Colorido
fviz_pca_var(data.pca, col.var = "cos2",
            gradient.cols = c("black", "orange", "green"),
            repel = TRUE)

#Print
print(fviz_pca_var_genes)

By GO term

ssGSEA

Preparar dados

# Inputs
data = ssgsea_results_unified %>% 
   filter(!is.na(vaccine),
          process != "IMMUNOGLOBULIN MEDIATED IMMUNE RESPONSE")
data_annotation = ann_vaccines_samples_4_12_23 %>% 
  mutate(day = as.factor(day),
         dose = as.factor(dose)) 
filename = "ssgsea_results_unified"

#Converter de long para wide

#Matriz com anotações
ann_vaccines_pca_matrix = data %>% 
  mutate(qvalue = as.numeric(qvalue)) %>% 
  filter(qvalue < 0.10) %>% 
  select(sample, process, nes) %>% 
  dcast(., `sample` ~ `process`, 
                     value.var = "nes", 
                     fun.aggregate = mean) %>% 
  replace(., . == "NaN", 0) %>% 
  as.data.frame() %>% 
  merge(data_annotation, by.x = "sample", by.y = "sample", all.x = T, all.y = F)


#Matriz para PCA
ann_vaccines_pca_matrix_ready = ann_vaccines_pca_matrix %>%
  select(!condition:previous_vaccination) %>% 
  column_to_rownames("sample")

# Verifique colunas com variancia baixa
nearZeroVarCols <- nearZeroVar(ann_vaccines_pca_matrix_ready, saveMetrics = TRUE)
ann_vaccines_pca_matrix_ready <- ann_vaccines_pca_matrix_ready[, !nearZeroVarCols$nzv]
pca_res <- prcomp(ann_vaccines_pca_matrix_ready, scale. = TRUE)

# Crie o gráfico de PCA
pca_plot = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'vaccine', 
                    label = 0) + 
  theme_minimal() +
  labs(title=filename) +
  theme(panel.grid = element_blank()) +
  scale_fill_continuous(type = "viridis")

ggplotly(pca_plot)

# Exiba o gráfico
print(pca_plot)
ggsave(pca_plot, filename = paste0(filename, "_", "PCA_Immune_GO_GSEA_not-ann.png"), width = 10, height = 8)

# Crie o gráfico de PCA

###### Condition
pca_plot_condition = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'condition', 
                    label = 0) + 
  theme(panel.grid = element_blank()) +
  labs(title=paste0(filename, "_bycondition")) + #scale fill manual
  scale_fill_continuous(type = "viridis") +
  theme_minimal() +
  theme(panel.grid = element_blank())

ggplotly(pca_plot_condition)


###### Vaccine
pca_plot_vac = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'vaccine', 
                    label = 0) + 
  labs(title=paste0(filename, "_byvaccine")) + #scale fill manual
  scale_color_manual(values = c("BBIBP" = "#dee2e6",
                                "BNT" = "#56cfe1",
                                "ChAd" = "#5e60ce",
                                "ZF2001" = "#b5179e",
                                "MO" = "#D7B0EE",
                                "I" = "#ff4d6d",
                                "H" = "grey95")) +
  theme_minimal() +
  theme(panel.grid = element_blank())

###### Day
pca_plot_day = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'day', 
                    label = 0) + 
  labs(title=paste0(filename, "_day")) + #scale fill manual
  scale_color_manual(values = c(
    "0" = "white",
    "1" = "#caf0f8",
    "2" = "#ade8f4",
    "3" = "#90e0ef",
    "4" = "#6CD5EA",
    "5" = "#48cae4",
    "6" = "#00b4d8",
    "7" = "#0096c7",
    "10" = "#0087BF",
    "14" = "#0077b6",
    "26" = "#015BA0",
    "28" = "#023e8a",
    "51" = "#03045e")) +
  theme_minimal() +
  theme(panel.grid = element_blank())

###### Dose

pca_plot_dose = autoplot(pca_res, 
                    data = ann_vaccines_pca_matrix, 
                    colour = 'dose', 
                    label = 0) + 
  labs(title=paste0(filename, "_dose")) +
  scale_color_manual(
    values = c("0" = "#caf0f8", 
               "1" = "#56cfe1", 
               "2" = "#5978d4",
               "3" = "#b5179e")) +
  theme_minimal() +
  theme(panel.grid = element_blank())

# Exiba o gráfico
print(pca_plot_condition)
print(pca_plot_day)
print(pca_plot_dose)
print(pca_plot_vac)

ggsave(pca_plot_condition, filename = paste0(filename, "CONDITION_PCA_Immune_GO_GSEA_not-ann.png"), width = 10, height = 8)
ggsave(pca_plot_vac, filename = paste0(filename, "_VACCINE_PCA_Immune_GO_GSEA_not-ann.png"), width = 10, height = 8)
ggsave(pca_plot_day, filename = paste0(filename, "_DAY_PCA_Immune_GO_GSEA_not-ann.png"), width = 10, height = 8)
ggsave(pca_plot_dose, filename = paste0(filename, "_DOSE_PCA_Immune_GO_GSEA_not-ann.png"), width = 10, height = 8)
############### KNN classification

#Determinar o número de clusters para KNN
pca_scores <- data.frame(pca_res$x[, 1:2])
fviz_nbclust(pca_scores,  
                     FUNcluster = kmeans,
                     method = "wss")

set.seed(666)                             # Set seed for randomization
kmeans_clust <- kmeans(pca_scores,        # Perform k-means clustering
                        centers = 3) # Definir numero de clusters

#Visualizar clusters
ggp2 <- fviz_pca_ind(pca_res,
                   habillage = kmeans_clust$cluster,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "t",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

print(ggp2)

ggsave(ggp2, file = paste0(filename, "_KNN_Clustered.png"), width = 5, height = 4)


# Clusterizar por grupo

#Vaccine
pca_group_vac <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$vaccine,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "t",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Vac_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

#Dose
pca_group_dose <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$dose,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "t",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Dose_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

#Day
pca_group_day <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$day,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "t",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Day_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())


#Salvar
ggsave(pca_group_day, file = paste0(filename, "_Day_Clustered.png"), width = 5, height = 4)
ggsave(pca_group_dose, file = paste0(filename, "_Dose_Clustered.png"), width = 5, height = 4)
ggsave(pca_group_vac, file = paste0(filename, "_Vac_Clustered.png"), width = 5, height = 4)
#Biplot
biplot = fviz_pca_biplot(pca_res,              # Visualize clusters in biplot
                      col.var = "black",
                      alpha.var = 0.5,
                      habillage = kmeans_clust$cluster,
                      repel = TRUE,
                      addEllipses = TRUE,
                      ellipse.type = "convex",
                      labelsize = 3,
                      label = "var",
                      palette = "Set1")


ggsave(biplot, file = paste0(filename, "_BIPLOT_KNN_Clustered.png"), width = 10, height = 8)
########Correlation plot
corr_matrix = cor(ann_vaccines_pca_matrix_ready) 

#Plot
corrplot = ggcorrplot(corr_matrix, hc.order = TRUE) + 
  theme(axis.text.x = element_text(angle = 90, size = 5), 
        axis.text.y = element_text(size = 5))
#Salvar
ggsave(corrplot, file = paste0(filename, "_corrplot.png"), 
       width = 4, #Grande 20, pequeno 10
       height= 4) #Grande 20, pequeno 10
print(corrplot)
data.pca <- princomp(corr_matrix) #PCA
summary(data.pca) #Retornar PCs


#########Scree plot
data.pca = princomp(corr_matrix) #PCA
summary(data.pca) #Retornar PCs

#########Scree plot
scree_plot = fviz_eig(data.pca, 
                      addlabels = TRUE,
                      ylim = c(0, 70)) +
  geom_col(color = "#00AFBB", fill = "#00AFBB") +
  theme_classic()

#Salvar
ggsave(scree_plot, file = paste0(filename, "_GSEA_screeplot.png"), width = 10, height = 3) 
print(scree_plot)


#Scree plot
loadings = data.frame(data.pca$loadings[, 1:3])
loadings$Genes = rownames(loadings)
loadings_1 = arrange(loadings, desc(Comp.1))
loadings_2 = arrange(loadings, desc(Comp.2))
loadings_3 = arrange(loadings, desc(Comp.3))

#Plot
loadings_1_plot = ggplot(loadings_1, aes(x = reorder(Genes, -Comp.1), y=Comp.1, fill = Comp.1)) + 
  ggtitle(paste0("Comp1-Comp2 Genes", filename)) + 
  ylab("Comp1") +
  xlab("Gene sets") +
  geom_bar(stat = "identity") + 
  theme_light() +
  theme(axis.text.x = element_text(vjust = 1, hjust = 1, angle = 45, size = 8), 
        axis.text.y = element_text(size = 5),
        plot.title = element_text(size = 15L, hjust = 0.5)) + 
  scale_fill_continuous(type = "viridis") #cores

print(loadings_1_plot)


loadings_2_plot = ggplot(loadings_2, aes(x = reorder(Genes, -Comp.2), y=Comp.2, fill = Comp.2)) + 
  ggtitle(paste0("Comp2-Comp3 Genes_", filename)) + 
  ylab("Comp2") +
  xlab("Gene sets") +
  geom_bar(stat = "identity") + 
  theme_light() +
  theme(axis.text.x = element_text(vjust = 1, hjust = 1, angle = 45, size = 8), 
        axis.text.y = element_text(size = 5),
        plot.title = element_text(size = 15L, hjust = 0.5)) + 
  scale_fill_continuous(type = "viridis") #cores

print(loadings_2_plot)


#Salvar
ggsave(loadings_1_plot, 
       file = paste0(filename, "_GSEA_genescomp1-2.png"), 
       width = 10, height = 5)

#Salvar
ggsave(loadings_2_plot, 
       file = paste0(filename, "_GSEA_genescomp2-3.png"), 
       width = 10, height = 5)


# Graph of the variables
fviz_pca_var_genes = fviz_pca_var(data.pca, 
                                  col.ind = "cos2",
                                  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
fviz_pca_var_genes

ggsave(fviz_pca_var_genes, file = paste0(filename, "_fviz_pca_var_GSEA.png"), width = 10)

cos2.1 = fviz_cos2(data.pca, choice = "var", axes = 1:2)
cos2.2 = fviz_cos2(data.pca, choice = "var", axes = 2:3)

ggsave(cos2.1, file = paste0(filename, "_cos2_GSEA_1.png"), width = 10)
ggsave(cos2.2, file = paste0(filename, "_cos2_GSEA_2.png"), width = 10)

PCA by condition

GSEA total

Preparar dados

############### KNN classification

#Determinar o número de clusters para KNN
pca_scores <- data.frame(pca_res$x[, 1:2])
fviz_nbclust(pca_scores,  
                     FUNcluster = kmeans,
                     method = "wss")


set.seed(666)                             # Set seed for randomization
kmeans_clust <- kmeans(pca_scores,        # Perform k-means clustering
                        centers = 2) # Definir numero de clusters

#Visualizar clusters
ggp2 <- fviz_pca_ind(pca_res,
                   habillage = kmeans_clust$cluster,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "t",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

print(ggp2)

ggsave(ggp2, file = paste0(filename, "_KNN_Clustered.png"), width = 5, height = 4)



# Clusterizar por grupo

#Vaccine
pca_group_vac <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$vaccine,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "convex",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Vac_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

#Dose
pca_group_dose <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$dose,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "convex",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Dose_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())

#Day
pca_group_day <- fviz_pca_ind(pca_res,
                   habillage = ann_vaccines_pca_matrix$day,
                   repel = TRUE,
                   addEllipses = TRUE,
                   ellipse.type = "convex",
                   label = "none",
                   labelsize = 0) +
  guides(color = guide_legend(override.aes = list(label = ""))) +
  ggtitle(paste0(filename,  "_Day_KNN_Clustered.png")) +
  scale_color_brewer(palette="Set1") +
  theme(panel.grid = element_blank())


print(pca_group_day)

print(pca_group_dose)

print(pca_group_vac)


#Salvar
ggsave(pca_group_day, file = paste0(filename, "_Day_Clustered.png"), width = 5, height = 4)
ggsave(pca_group_dose, file = paste0(filename, "_Dose_Clustered.png"), width = 5, height = 4)
ggsave(pca_group_vac, file = paste0(filename, "_Vac_Clustered.png"), width = 5, height = 4)

#Biplot
biplot = fviz_pca_biplot(pca_res,              # Visualize clusters in biplot
                      col.var = "black",
                      alpha.var = 0.5,
                      habillage = kmeans_clust$cluster,
                      repel = TRUE,
                      addEllipses = TRUE,
                      ellipse.type = "convex",
                      labelsize = 3,
                      label = "var",
                      palette = "Set1")


ggsave(biplot, file = paste0(filename, "_BIPLOT_KNN_Clustered.png"), width = 10, height = 8)
########Correlation plot
corr_matrix = cor(ann_vaccines_pca_matrix_ready) 

#Plot
corrplot = ggcorrplot(corr_matrix, hc.order = TRUE) + 
  theme(axis.text.x = element_text(angle = 90, size = 5), 
        axis.text.y = element_text(size = 5))
#Salvar
ggsave(corrplot, file = paste0(filename, "_corrplot.png"), 
       width = 4, #Grande 20, pequeno 10
       height= 4) #Grande 20, pequeno 10
print(corrplot)
data.pca <- princomp(corr_matrix) #PCA
summary(data.pca) #Retornar PCs


#########Scree plot
data.pca = princomp(corr_matrix) #PCA
summary(data.pca) #Retornar PCs

#########Scree plot
scree_plot = fviz_eig(data.pca, 
                      addlabels = TRUE,
                      ylim = c(0, 70)) +
  geom_col(color = "#00AFBB", fill = "#00AFBB") +
  theme_classic()

#Salvar
ggsave(scree_plot, file = paste0(filename, "_GSEA_screeplot.png"), width = 10, height = 3) 
print(scree_plot)


#Scree plot
loadings = data.frame(data.pca$loadings[, 1:3])
loadings$Genes = rownames(loadings)
loadings_1 = arrange(loadings, desc(Comp.1))
loadings_2 = arrange(loadings, desc(Comp.2))
loadings_3 = arrange(loadings, desc(Comp.3))

#Plot
loadings_1_plot = ggplot(loadings_1, aes(x = reorder(Genes, -Comp.1), y=Comp.1, fill = Comp.1)) + 
  ggtitle(paste0("Comp1-Comp2 Genes", filename)) + 
  ylab("Comp1") +
  xlab("Gene sets") +
  geom_bar(stat = "identity") + 
  theme_light() +
  theme(axis.text.x = element_text(vjust = 1, hjust = 1, angle = 45, size = 8), 
        axis.text.y = element_text(size = 5),
        plot.title = element_text(size = 15L, hjust = 0.5)) + 
  scale_fill_continuous(type = "viridis") #cores

print(loadings_1_plot)


loadings_2_plot = ggplot(loadings_2, aes(x = reorder(Genes, -Comp.2), y=Comp.2, fill = Comp.2)) + 
  ggtitle(paste0("Comp2-Comp3 Genes_", filename)) + 
  ylab("Comp2") +
  xlab("Gene sets") +
  geom_bar(stat = "identity") + 
  theme_light() +
  theme(axis.text.x = element_text(vjust = 1, hjust = 1, angle = 45, size = 8), 
        axis.text.y = element_text(size = 5),
        plot.title = element_text(size = 15L, hjust = 0.5)) + 
  scale_fill_continuous(type = "viridis") #cores

print(loadings_2_plot)


#Salvar
ggsave(loadings_1_plot, 
       file = paste0(filename, "_GSEA_genescomp1-2.png"), 
       width = 10, height = 5)

#Salvar
ggsave(loadings_2_plot, 
       file = paste0(filename, "_GSEA_genescomp2-3.png"), 
       width = 10, height = 5)


# Graph of the variables
fviz_pca_var_genes = fviz_pca_var(data.pca, 
                                  col.ind = "cos2",
                                  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
fviz_pca_var_genes

ggsave(fviz_pca_var_genes, file = paste0(filename, "_fviz_pca_var_GSEA.png"), width = 10)

cos2.1 = fviz_cos2(data.pca, choice = "var", axes = 1:2)
cos2.2 = fviz_cos2(data.pca, choice = "var", axes = 2:3)

ggsave(cos2.1, file = paste0(filename, "_cos2_GSEA_1.png"), width = 10)
ggsave(cos2.2, file = paste0(filename, "_cos2_GSEA_2.png"), width = 10)

By genes

Processar dados

ImmuneGO_Genes = all_degs_p_05_vac_infected_19_12_23 %>% 
  select(-"...1") %>% 
  inner_join(ImmuneGO_Annotated_Genes_8_1_24 %>% 
               select(genes) %>% 
               distinct(),
               by = "genes") %>% 
  distinct()

nonImmuneGO_Genes = all_degs_p_05_vac_infected_19_12_23 %>% 
  select(-"...1") %>% 
  anti_join(ImmuneGO_Annotated_Genes_8_1_24 %>% 
               select(genes) %>% 
               distinct(),
               by = "genes") %>% 
  distinct()

all_non_ImmuneGO_Genes = all_degs_p_05_vac_infected_19_12_23 %>% 
  select(-"...1") %>% 
  distinct()

#INPUT
data_genes = ImmuneGO_Genes
filename = "ImmuneGO_Genes"

data_annotation = ann_vaccines %>% 
  mutate(day = as.factor(day),
         dose = as.factor(dose)) 

#Converter de long para wide

#Matriz com anotações
ann_vaccines_pca_matrix = data_genes %>% 
  select(condition, genes, log2fold_change) %>% 
  dcast(., `condition` ~ `genes`, 
                     value.var = "log2fold_change", 
                     fun.aggregate = mean) %>% 
  replace(., . == "NaN", 0) %>% 
  as.data.frame() %>% 
  merge(data_annotation %>% mutate(week = as.factor(week)), by = "condition", all.x = T, all.y = F)

ggplotly(pca_plot_condition_lab)
Warning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issuesWarning: geom_GeomTextRepel() has yet to be implemented in plotly.
  If you'd like to see this geom implemented,
  Please open an issue with your example code at
  https://github.com/ropensci/plotly/issues

Ci0tLQp0aXRsZTogIlBDQSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBQQ0EKClR1dG9yaWFpcwo8aHR0cHM6Ly93d3cuZGF0YWNhbXAuY29tL3R1dG9yaWFsL3BjYS1hbmFseXNpcy1yPiAKPGh0dHBzOi8vcnBrZ3MuZGF0YW5vdmlhLmNvbS9mYWN0b2V4dHJhL2luZGV4Lmh0bWw+IDxodHRwOi8vd3d3LnN0aGRhLmNvbS9lbmdsaXNoL2FydGljbGVzLzMxLXByaW5jaXBhbC1jb21wb25lbnQtbWV0aG9kcy1pbi1yLXByYWN0aWNhbC1ndWlkZS8xMTQtbWNhLW11bHRpcGxlLWNvcnJlc3BvbmRlbmNlLWFuYWx5c2lzLWluLXItZXNzZW50aWFscy8+CjxodHRwczovL3N0YXRpc3RpY3NnbG9iZS5jb20vcGNhLWJlZm9yZS1rLW1lYW5zLWNsdXN0ZXJpbmctcj4+CgpCaWJsaW90ZWNhcwpgYGB7cn0KbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KGNhcmV0KQpsaWJyYXJ5KHN0YXRzKQpsaWJyYXJ5KGdnZm9ydGlmeSkKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCgojIERFU2VxMiByZXN1bHRzCgpgYGB7cn0KIyBDcmlhciB1bSBQQ0EgY29tIG8gcC12YWxvciBkZSBjYWRhIGdlbmUgCnBjYV9kYXRhIDwtIHByY29tcCh0KGFzc2F5KGRkcykpKSAgIyBQZXJmb3JtIFBDQSBvbiB0aGUgdHJhbnNwb3NlZCBjb3VudCBvciBub3JtYWxpemVkIGRhdGEKCiMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggUENBIGNvbXBvbmVudHMgYW5kIFRpbWVwb2ludGYgYW5kIEZpcnN0U2Vjb25kRG9zZWYKcGNhX2RmIDwtIGRhdGEuZnJhbWUoUEMxID0gcGNhX2RhdGEkeFssIDFdLCBQQzIgPSBwY2FfZGF0YSR4WywgMl0sCiAgICAgICAgICAgICAgICAgICAgIFRpbWVwb2ludCA9IGNvbERhdGEoZGRzKSRUaW1lcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgVmFjY2luZXMgPSBjb2xEYXRhKGRkcykkVmFjY2luZSkKCiMgUGxvdCB0aGUgUENBIHVzaW5nIGdncGxvdDIKZ2dwbG90KHBjYV9kZiwgYWVzKHggPSBQQzEsIHkgPSBQQzIsIGNvbG9yID0gVmFjY2luZXMsIHNoYXBlID0gVGltZXBvaW50KSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBsYWJzKHRpdGxlID0gIlByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgLSBWYWNjaW5lLVRpbWVwb2ludCIsIHggPSAiUEMxIiwgeSA9ICJQQzIiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojREVTZXEyIG5hdGl2ZSBhbmFseXNpcwp2c2QgPC0gdnN0KGRkcywgYmxpbmQ9RkFMU0UpCnBjYURhdGEgPSBwbG90UENBKHZzZCxpbnRncm91cD1jKCJUaW1lcG9pbnQiLCAiVmFjY2luZSIpLCByZXR1cm5EYXRhID0gVFJVRSkKcGVyY2VudFZhciA8LSByb3VuZCgxMDAgKiBhdHRyKHBjYURhdGEsICJwZXJjZW50VmFyIikpCgpwY2FfcGxvdCA9IGdncGxvdChwY2FEYXRhLCBhZXMoUEMxLCBQQzIsIGNvbG9yPVZhY2NpbmUsIHNoYXBlPVRpbWVwb2ludCkpICsKICBnZW9tX3BvaW50KHNpemU9MikgKwogIHhsYWIocGFzdGUwKCJQQzE6ICIscGVyY2VudFZhclsxXSwiJSB2YXJpYW5jZSIpKSArCiAgeWxhYihwYXN0ZTAoIlBDMjogIixwZXJjZW50VmFyWzJdLCIlIHZhcmlhbmNlIikpICsgCiAgY29vcmRfZml4ZWQoKSArIGdndGl0bGUoIlByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgLSBWYWNjaW5lcyBhbmQgVGltZXBvaW50IikKCmdnc2F2ZShwY2FfcGxvdCwgZmlsZSA9ICJHU0UyMDYwMjNfUENBLnBuZyIpCgpgYGAKCgoKIyBQQ0EgQnkgc2FtcGxlCgojIyMgQnkgZ2VuZXMKClBhZHJvbml6YXIKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImphbml0b3IiKQpsaWJyYXJ5KGphbml0b3IpCgojSW5wdXRzCmRlZ3NfYWxsc3R1ZGllc191cGRvd24gPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duX2ZpbHRlciAlPiUgCiAgc2VsZWN0KC1lbmRzX3dpdGgoIi55IikpICU+JSAKICByZW5hbWVfYWxsKH5zdWIoIlxcLngkIiwgIiIsIC4pKSAlPiUKICBjbGVhbl9uYW1lcygpICU+JSAKICByZW5hbWUobGZjc2UgPSBsZmNfc2UsCiAgICAgICAgIGwyZmMgPSBsb2cyZm9sZF9jaGFuZ2UpICU+JSAKICBzZWxlY3QoLSBzZXRfc2l6ZV9pbnRlcnZhbHMpICU+JSAKICBncm91cF9ieShzdHVkeSkgJT4lIAogIHNlbGVjdCh2YWNjaW5lLCBzdHVkeSwgZ3NlX2lkLCBnZW5lcywgcHJvY2VzcywgZ2VuZV9zZXRfc2hvcnQsIGltbXVuZV9zeXN0ZW0sIGltbXVuZV9zdWJfc3lzdGVtLCBpbW11bmVfdGlzc3VlLCBnb190ZXJtLCBzZXRfc2l6ZSwgZXZlcnl0aGluZygpLCBmaWx0ZXIpICU+JSAKICBtdXRhdGUoc3R1ZHkgPSBpZmVsc2Uoc3R1ZHkgPT0gIkNoQWQgKFYyLCBEMikiLCAiQ2hBZCAoVjIsIEQzKSIsIHN0dWR5KSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIGZpbHRlcihmaWx0ZXIgPT0gInA8MC4wNSIpCgojU2FsdmFyCndyaXRlLmNzdihkZWdzX2FsbHN0dWRpZXNfdXBkb3duLCBmaWxlID0gIkltbXVuZUdPX2RlZ3NfYWxsc3R1ZGllc191cGRvd25fZmlsdGVyX3AwMDUuY3N2IikKYGBgCgpTZXBhcmFyIHByb2Nlc3NvcyBpbXVub2zDs2dpY29zIGVtIG9iamV0b3MKYGBge3J9CiMjIyMjIyMjIyMjIyMjIElubmF0ZQpJbW11bmVfR09faW5uYXRlID0gSW1tdW5lR09fQW5ub3RhdGVkX0dlbmVzICU+JSAgIzI1MCBnZW5lcyAoU2V0U2l6ZSkKICBmaWx0ZXIocHJvY2VzcyA9PSAiSU5OQVRFIElNTVVORSBSRVNQT05TRSIgJiAKICAgICAgICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgICAgICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpKQoKSW1tdW5lX0dPX0NvbXBsZW1lbnQgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjMjcgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgPT0gIkNPTVBMRU1FTlQgQUNUSVZBVElPTiIgJiAKICAgICAgICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgICAgICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpKQoKSW1tdW5lX0dPX2lubmF0ZV9JbmZsYW1tYXRvcnkgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjMTQgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgPT0gIklORkxBTU1BVE9SWSBSRVNQT05TRSBUTyBBTlRJR0VOSUMgU1RJTVVMVVMiICYgCiAgICAgICAgICgoZ3NlX2lkICVpbiUgYygiR1NFMTk5NzUwIiwgIkdTRTIwMTUzMyIpICYgcGFkaiA8PSAwLjA1KSB8CiAgICAgICAgICAoZ3NlX2lkID09ICJHU0UyMDYwMjMiICYgcHZhbHVlIDw9IDAuMDUpKSkKCkltbXVuZV9HT19pbm5hdGVfRGVuZHJpdGljQ2VsbHMgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjMTEgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgJWluJSBjKCJERU5EUklUSUMgQ0VMTCBDSEVNT1RBWElTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJERU5EUklUSUMgQ0VMTCBIT01FT1NUQVNJUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAiREVORFJJVElDIENFTEwgTUlHUkFUSU9OIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJNWUVMT0lEIERFTkRSSVRJQyBDRUxMIEFDVElWQVRJT04iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIk1ZRUxPSUQgREVORFJJVElDIENFTEwgQ0hFTU9UQVhJUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAiTVlFTE9JRCBERU5EUklUSUMgQ0VMTCBESUZGRVJFTlRJQVRJT04iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBMQVNNQUNZVE9JRCBERU5EUklUSUMgQ0VMTCBBQ1RJVkFUSU9OIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJQTEFTTUFDWVRPSUQgREVORFJJVElDIENFTEwgRElGRkVSRU5USUFUSU9OIikgJiAKICAgICAgICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgICAgICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpKQoKCkltbXVuZV9HT19pbm5hdGVfTWFjcm9waGFnZXMgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAKICBmaWx0ZXIocHJvY2VzcyAlaW4lIGMoIk1BQ1JPUEhBR0UgQUNUSVZBVElPTiIsIAogICAgICAgICAgICAgICAgICAgICAgICAiTUFDUk9QSEFHRSBBQ1RJVkFUSU9OIElOVk9MVkVEIElOIElNTVVORSBSRVNQT05TRSIsIAogICAgICAgICAgICAgICAgICAgICAgICAiTUFDUk9QSEFHRSBDSEVNT1RBWElTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJNQUNST1BIQUdFIEhPTUVPU1RBU0lTIiwKICAgICAgICAgICAgICAgICAgICAgICAgIk1BQ1JPUEhBR0UgTUlHUkFUSU9OIikgJiAKICAgICAgICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgICAgICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpKQoKSW1tdW5lX0dPX2lubmF0ZV9BUFAgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjMjEgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgPT0gIkFOVElHRU4gUFJPQ0VTU0lORyBBTkQgUFJFU0VOVEFUSU9OIiAmIAogICAgICAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgICAgICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkpCgpJbW11bmVfR09faW5uYXRlX1RMUiA9IGRlZ3NfYWxsc3R1ZGllc191cGRvd24gJT4lICMxNCBnZW5lcyAoU2V0U2l6ZSkKICBmaWx0ZXIocHJvY2VzcyA9PSAiVE9MTC1MSUtFIFJFQ0VQVE9SIFNJR05BTElORyBQQVRIV0FZIiAmIAogICAgICAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgICAgICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkpCgpJbW11bmVfR09faW5uYXRlX1BSUiA9IGRlZ3NfYWxsc3R1ZGllc191cGRvd24gJT4lICM4IGdlbmVzIChTZXRTaXplKQogIGZpbHRlcihwcm9jZXNzID09ICJQQVRURVJOIFJFQ09HTklUSU9OIFJFQ0VQVE9SIFNJR05BTElORyBQQVRIV0FZIiAmIAogICAgICAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgICAgICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkpCkltbXVuZV9HT19pbm5hdGVfQ1BSID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzYgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgPT0gIkNZVE9TT0xJQyBQQVRURVJOIFJFQ09HTklUSU9OIFJFQ0VQVE9SIFNJR05BTElORyBQQVRIV0FZIiAmIAogICAgICAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgICAgICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkpCgojIyMjIyMjIyMjIyMjIyBBZGFwdGl2ZQpJbW11bmVfR09fYWRhcHRpdmUgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjMzMwIGdlbmVzIChTZXRTaXplKQogIGZpbHRlcihwcm9jZXNzID09ICJBREFQVElWRSBJTU1VTkUgUkVTUE9OU0UiICYKICAgICgoZ3NlX2lkICVpbiUgYygiR1NFMTk5NzUwIiwgIkdTRTIwMTUzMyIpICYgcGFkaiA8PSAwLjA1KSB8CiAgICAoZ3NlX2lkID09ICJHU0UyMDYwMjMiICYgcHZhbHVlIDw9IDAuMDUpKSAmCiAgICAhKGdzZV9pZCAlaW4lIGMoIkdTRTIwMTUzMyIpKSkKCiNIdW1vcmFsCkltbXVuZV9HT19hZGFwdGl2ZV9odW1vcmFsID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzI3IGdlbmVzIChTZXRTaXplKQogIGZpbHRlcihwcm9jZXNzID09ICJIVU1PUkFMIEFEQVBUSVZFIElNTVVORSBTWVNURU0iICYKICAgICgoZ3NlX2lkICVpbiUgYygiR1NFMTk5NzUwIiwgIkdTRTIwMTUzMyIpICYgcGFkaiA8PSAwLjA1KSB8CiAgICAoZ3NlX2lkID09ICJHU0UyMDYwMjMiICYgcHZhbHVlIDw9IDAuMDUpKSAmCiAgICAhKGdzZV9pZCAlaW4lIGMoIkdTRTIwMTUzMyIpKSkKCkltbXVuZV9HT19hZGFwX0lnTWVkaWF0ZWQgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjNjIgZ2VuZXMgKFNldFNpemUpCiAgZmlsdGVyKHByb2Nlc3MgPT0gIklNTVVOT0dMT0JVTElOIE1FRElBVEVEIElNTVVORSBSRVNQT05TRSIgJgogICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpICYKICAgICEoZ3NlX2lkICVpbiUgYygiR1NFMjAxNTMzIikpKQoKSW1tdW5lX0dPX2FkYXBfQnJlY2VwdG9yc2lnID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzMxIGdlbmVzIChTZXRTaXplKQogIGZpbHRlcihwcm9jZXNzID09ICJCIENFTEwgUkVDRVBUT1IgU0lHTkFMSU5HIFBBVEhXQVkiICYKICAgICgoZ3NlX2lkICVpbiUgYygiR1NFMTk5NzUwIiwgIkdTRTIwMTUzMyIpICYgcGFkaiA8PSAwLjA1KSB8CiAgICAoZ3NlX2lkID09ICJHU0UyMDYwMjMiICYgcHZhbHVlIDw9IDAuMDUpKSAmCiAgICAhKGdzZV9pZCAlaW4lIGMoIkdTRTIwMTUzMyIpKSkKCkltbXVuZV9HT19hZGFwX0JhY3RpdmF0aW9uID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzM2IGdlbmVzCiAgZmlsdGVyKHByb2Nlc3MgPT0gIkIgQ0VMTCBBQ1RJVkFUSU9OIiAmCiAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkgJgogICAgIShnc2VfaWQgJWluJSBjKCJHU0UyMDE1MzMiKSkpCgojQ2VsbHVsYXIKCkltbXVuZV9HT19hZGFwdGl2ZV9jZWxsdWxhciA9IGRlZ3NfYWxsc3R1ZGllc191cGRvd24gJT4lICM0MSBnZW5lcwogIGZpbHRlcihwcm9jZXNzID09ICJDRUxMVUxBUiBBREFQVElWRSBJTU1VTkUgU1lTVEVNIiAmCiAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkgJgogICAgIShnc2VfaWQgJWluJSBjKCJHU0UyMDE1MzMiKSkpCgpJbW11bmVfR09fYWRhcHRpdmVfY2VsbHVsYXJfdGNlbGxhY3RpdmF0aW9uID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzQxIGdlbmVzCiAgZmlsdGVyKHByb2Nlc3MgPT0gIlQgQ0VMTCBBQ1RJVkFUSU9OIiAmCiAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkgJgogICAgIShnc2VfaWQgJWluJSBjKCJHU0UyMDE1MzMiKSkpCgpJbW11bmVfR09fYWRhcHRpdmVfY2VsbHVsYXJfdHJlY2VwdG9yID0gZGVnc19hbGxzdHVkaWVzX3VwZG93biAlPiUgIzc4IGdlbmVzCiAgZmlsdGVyKHByb2Nlc3MgPT0gIlQgQ0VMTCBSRUNFUFRPUiBTSUdOQUxJTkcgUEFUSFdBWSIgJgogICAgKChnc2VfaWQgJWluJSBjKCJHU0UxOTk3NTAiLCAiR1NFMjAxNTMzIikgJiBwYWRqIDw9IDAuMDUpIHwKICAgIChnc2VfaWQgPT0gIkdTRTIwNjAyMyIgJiBwdmFsdWUgPD0gMC4wNSkpICYKICAgICEoZ3NlX2lkICVpbiUgYygiR1NFMjAxNTMzIikpKQoKSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyX3RoMSA9IGRlZ3NfYWxsc3R1ZGllc191cGRvd24gJT4lICM2IGdlbmVzCiAgZmlsdGVyKHByb2Nlc3MgPT0gIlQtSEVMUEVSIDEgVFlQRSBJTU1VTkUgUkVTUE9OU0UiICYKICAgICgoZ3NlX2lkICVpbiUgYygiR1NFMTk5NzUwIiwgIkdTRTIwMTUzMyIpICYgcGFkaiA8PSAwLjA1KSB8CiAgICAoZ3NlX2lkID09ICJHU0UyMDYwMjMiICYgcHZhbHVlIDw9IDAuMDUpKSAmCiAgICAhKGdzZV9pZCAlaW4lIGMoIkdTRTIwMTUzMyIpKSkKCkltbXVuZV9HT19hZGFwdGl2ZV9jZWxsdWxhcl90aDIgPSBkZWdzX2FsbHN0dWRpZXNfdXBkb3duICU+JSAjNSBnZW5lcwogIGZpbHRlcihwcm9jZXNzID09ICJUWVBFIDIgSU1NVU5FIFJFU1BPTlNFIiAmCiAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkgJgogICAgIShnc2VfaWQgJWluJSBjKCJHU0UyMDE1MzMiKSkpCgpJbW11bmVfR09fYWRhcHRpdmVfY2VsbHVsYXJfdGgxNyA9IGRlZ3NfYWxsc3R1ZGllc191cGRvd24gJT4lICMzIGdlbmVzCiAgZmlsdGVyKHByb2Nlc3MgPT0gIlQtSEVMUEVSIDE3IFRZUEUgSU1NVU5FIFJFU1BPTlNFIiAmCiAgICAoKGdzZV9pZCAlaW4lIGMoIkdTRTE5OTc1MCIsICJHU0UyMDE1MzMiKSAmIHBhZGogPD0gMC4wNSkgfAogICAgKGdzZV9pZCA9PSAiR1NFMjA2MDIzIiAmIHB2YWx1ZSA8PSAwLjA1KSkgJgogICAgIShnc2VfaWQgJWluJSBjKCJHU0UyMDE1MzMiKSkpCgoKCkltbXVuZUdPX0dlbmVzX2ludGVyZXN0ID0gYmluZF9yb3dzKAogIEltbXVuZV9HT19nZW5lcmFsX2lubmF0ZSwKICBJbW11bmVfR09fZ2VuZXJhbF9Db21wbGVtZW50LAogIEltbXVuZV9HT19pbm5hdGVfSW5mbGFtbWF0b3J5LAogIEltbXVuZV9HT19pbm5hdGVfTWFjcm9waGFnZXMsCiAgSW1tdW5lX0dPX2lubmF0ZV9EZW5kcml0aWNDZWxscywKICBJbW11bmVfR09faW5uYXRlX0FQUCwKICBJbW11bmVfR09faW5uYXRlX1RMUiwKICBJbW11bmVfR09faW5uYXRlX1BSUiwKICBJbW11bmVfR09faW5uYXRlX0NQUiwKICBJbW11bmVfR09fYWRhcHRpdmUsCiAgSW1tdW5lX0dPX2FkYXB0aXZlX2h1bW9yYWwsCiAgSW1tdW5lX0dPX2FkYXBfSWdNZWRpYXRlZCwKICBJbW11bmVfR09fYWRhcF9CcmVjZXB0b3JzaWcsCiAgSW1tdW5lX0dPX2FkYXBfQmFjdGl2YXRpb24sCiAgSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyLAogIEltbXVuZV9HT19hZGFwdGl2ZV9jZWxsdWxhcl90Y2VsbGFjdGl2YXRpb24sCiAgSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyX3RyZWNlcHRvciwKICBJbW11bmVfR09fYWRhcHRpdmVfY2VsbHVsYXJfdGgxLAogIEltbXVuZV9HT19hZGFwdGl2ZV9jZWxsdWxhcl90aDIsCiAgSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyX3RoMTcpCgp3cml0ZS5jc3YoSW1tdW5lR09fR2VuZXNfaW50ZXJlc3QsIGZpbGUgPSAiSW1tdW5lR09fR2VuZXNfaW50ZXJlc3RfYnlzdHVkeS5jc3YiKQoKYGBgCgpQcm9jZXNzYXIgZGFkb3MKYGBge3J9CiMgSW1tdW5lX0dPX2dlbmVyYWxfaW5uYXRlCiMgSW1tdW5lX0dPX2FkYXB0aXZlCgpJbW11bmVfR09fZ2VuZXJhbF9Db21wbGVtZW50CkltbXVuZV9HT19pbm5hdGVfTWFjcm9waGFnZXMKSW1tdW5lX0dPX2lubmF0ZV9EZW5kcml0aWNDZWxscwpJbW11bmVfR09faW5uYXRlX0luZmxhbW1hdG9yeQpJbW11bmVfR09faW5uYXRlX0FQUApJbW11bmVfR09faW5uYXRlX1RMUiAjTsOjbyB1c2FyCkltbXVuZV9HT19pbm5hdGVfUFJSICMoU0lHTkFMSU5HIFBBVEhXQVkpCkltbXVuZV9HT19pbm5hdGVfQ1BSICNOw6NvIHVzYXIKSW1tdW5lX0dPX2FkYXB0aXZlX2h1bW9yYWwKSW1tdW5lX0dPX2FkYXBfSWdNZWRpYXRlZApJbW11bmVfR09fYWRhcF9CcmVjZXB0b3JzaWcKSW1tdW5lX0dPX2FkYXBfQmFjdGl2YXRpb24KSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyCkltbXVuZV9HT19hZGFwdGl2ZV9jZWxsdWxhcl90Y2VsbGFjdGl2YXRpb24KSW1tdW5lX0dPX2FkYXB0aXZlX2NlbGx1bGFyX3RyZWNlcHRvcgoKCiNJTlBVVApkYXRhX2dlbmVzID0gSW1tdW5lX0dPX2FkYXB0aXZlCmZpbGVuYW1lID0gIkltbXVuZV9HT19hZGFwdGl2ZSIKYGBgCgpQQ0EKCmBgYHtyfQojQ29udmVydGVyIGRlIGxvbmcgcGFyYSB3aWRlCm1hdHJpeF9nZW5lcyA9IGRhdGFfZ2VuZXMgJT4lIAogIHNlbGVjdChzdHVkeSwgZ2VuZXMsIGwyZmMpICU+JSAgCiAgZGNhc3QoYHN0dWR5YCB+IGBnZW5lc2AsIAogICAgICAgIHZhbHVlLnZhciA9ICJsMmZjIiwgCiAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3R1ZHkiKSAlPiUgCiAgcmVwbGFjZShpcy5uYSguKSwgMCkKCm1hdHJpeF9kYXRhX3BjYSA9IG1hdHJpeF9nZW5lcyAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJDb25kaXRpb24iKQoKbWF0cml4X2RhdGFfcGNhX3JlYWR5ID0gbWF0cml4X2RhdGFfcGNhICU+JSAKICBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gIkNvbmRpdGlvbiIpCgphbm5fdmFjY2luZXNfcGNhX21hdHJpeCA9IGFubl92YWNjaW5lc19wY2EgJT4lIAogIG1lcmdlKG1hdHJpeF9kYXRhX3BjYSwgCiAgICAgICAgYnkueCA9ICJDb25kaXRpb24iLCAKICAgICAgICBhbGwueCA9IEYsIAogICAgICAgIGFsbC55ID0gRikgJT4lIAogIHNlbGVjdChDb25kaXRpb246RWZmaWNhY3kpCgojIFZlcmlmaXF1ZSBxdWFpcyBjb2x1bmFzIHTDqm0gdmFyacOibmNpYSBtdWl0byBiYWl4YQpuZWFyWmVyb1ZhckNvbHMgPC0gbmVhclplcm9WYXIobWF0cml4X2RhdGFfcGNhX3JlYWR5LCBzYXZlTWV0cmljcyA9IFRSVUUpCm1hdHJpeF9kYXRhX3BjYV9yZWFkeSA8LSBtYXRyaXhfZGF0YV9wY2FfcmVhZHlbLCAhbmVhclplcm9WYXJDb2xzJG56dl0KcGNhX3JlcyA8LSBwcmNvbXAobWF0cml4X2RhdGFfcGNhX3JlYWR5LCBzY2FsZS4gPSBUUlVFKQoKIyBDcmllIG8gZ3LDoWZpY28gZGUgUENBCnBjYV9wbG90X2FubiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ1ZhY2NpbmUnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDEpICsgIzE6IGRpc3BsYXksIDA6IGhpZGUKICBsYWJzKHRpdGxlPWZpbGVuYW1lKSArCiAgdGhlbWVfY2xhc3NpYygpCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyhCQklCUCA9ICIjYmxhY2siLCAKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpGMjAwMSA9ICJibGFjayIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTlQgPSAiIzU2Y2ZlMSIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaEFkID0gIiM4MGZmZGIiICwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaEFkLUJOVCIgPSAiIzcyZWZkZCIpKSAKCnBjYV9wbG90X25vdF9hbm4gPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdWYWNjaW5lJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArICMxOiBkaXNwbGF5LCAwOiBoaWRlCiAgbGFicyh0aXRsZT1maWxlbmFtZSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgc3RhdF9lbGxpcHNlKHR5cGUgPSAidCIpCgojU2FsdmFyCmdnc2F2ZShwY2FfcGxvdF9ub3RfYW5uLCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9QQ0Ffbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKZ2dzYXZlKHBjYV9wbG90X2FubiwgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfUENBX2Fubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKCiMgRXhpYmEgbyBncsOhZmljbwpwcmludChwY2FfcGxvdF9hbm4pCnByaW50KHBjYV9wbG90X25vdF9hbm4pCgojIyMjIyMjIyMjIyMjIyMgS05OIGNsYXNzaWZpY2F0aW9uCgojRGV0ZXJtaW5hciBvIG7Dum1lcm8gZGUgY2x1c3RlcnMgcGFyYSBLTk4KcGNhX3Njb3JlcyA8LSBkYXRhLmZyYW1lKHBjYV9yZXMkeFssIDE6Ml0pCmdncDEgPC0gZnZpel9uYmNsdXN0KHBjYV9zY29yZXMsICAKICAgICAgICAgICAgICAgICAgICAgRlVOY2x1c3RlciA9IGttZWFucywKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIndzcyIpCgpnZ3AxIAoKc2V0LnNlZWQoMTIzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXQgc2VlZCBmb3IgcmFuZG9taXphdGlvbgprbWVhbnNfY2x1c3QgPC0ga21lYW5zKHBjYV9zY29yZXMsICAgICAgICAjIFBlcmZvcm0gay1tZWFucyBjbHVzdGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcnMgPSA0KSAjIERlZmluaXIgbnVtZXJvIGRlIGNsdXN0ZXJzCgojVmlzdWFsaXphciBjbHVzdGVycwpnZ3AyIDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0ga21lYW5zX2NsdXN0JGNsdXN0ZXIsCiAgICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBlbGxpcHNlLnR5cGUgPSAiY29udmV4IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsc2l6ZSA9IDIpICsKICAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChsYWJlbCA9ICIiKSkpICsKICBnZ3RpdGxlKHBhc3RlMChmaWxlbmFtZSwgICJLTk5fQ2x1c3RlcmVkLnBuZyIpKQoKcHJpbnQoZ2dwMikKZ2dzYXZlKGdncDIsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJLTk5fQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCgoKYGBgCgoKYGBge3J9CiMjIyMjIyMjQ29ycmVsYXRpb24gcGxvdAojTWF0cml6CmNvcnJfbWF0cml4ID0gY29yKG1hdHJpeF9kYXRhX3BjYV9yZWFkeSkgCmxpYnJhcnkoImNvcnJwbG90IikKdmFyIDwtIGdldF9wY2FfdmFyKHBjYV9yZXMpCmNvcnJwbG90KHZhciRjb3MyLCBvcmRlciA9ICdBT0UnKQoKIyMjIENvbnRyaWJ1acOnw6NvIGRvcyBnZW5lcyBwcmluY2lwYWlzIHBhcmEgY2FkYSBQQwojIENvbXAxCnZhcl9vcmRlbmFkb190b3AyMF9kaW0xIDwtIHZhciRjb3MyICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhcnJhbmdlKGRlc2MoLlssIDFdKSkgJT4lICAgIyBPcmRlbmFyIHBlbGEgcHJpbWVpcmEgY29sdW5hIGVtIG9yZGVtIGRlY3Jlc2NlbnRlCiAgc2xpY2VfaGVhZChuID0gMjApICU+JSAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNTAgbGluaGFzCiAgc2VsZWN0KDE6MSkgJT4lICAgICAgICAgICAgICAgICAgIyBTZWxlY2lvbmFyIGFzIHByaW1laXJhcyA1IGNvbHVuYXMKICBhcy5tYXRyaXgoKQoKY29ycGxvdF9kaW0xID0ge2NvcnJwbG90KHZhcl9vcmRlbmFkb190b3AyMF9kaW0xLCAKICAgICAgICAgaXMuY29yciA9IFQsIHRsLmNvbCA9ICdibGFjaycsIAogICAgICAgICB0bC5jZXggPSAwLjUsIAogICAgICAgICBhZGRDb2VmLmNvbCA9ICd3aGl0ZScsCiAgICAgICAgIG51bWJlci5jZXggPSAwLjQsCiAgICAgICAgIGNsLnBvcyA9ICduJywgCiAgICAgICAgIGNvbCA9ICJQdXJwbGUiKSAgOwogICAgICAgICMgQ2FsbCB0aGUgcmVjb3JkUGxvdCgpIGZ1bmN0aW9uIHRvIHJlY29yZCB0aGUgcGxvdAogICAgICAgIHJlY29yZFBsb3QoKQogICAgICAgfQoKI0NvbXAyCnZhcl9vcmRlbmFkb190b3AyMF9kaW0yIDwtIHZhciRjb3MyICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhcnJhbmdlKGRlc2MoLlssIDJdKSkgJT4lICAgIyBPcmRlbmFyIHBlbGEgcHJpbWVpcmEgY29sdW5hIGVtIG9yZGVtIGRlY3Jlc2NlbnRlCiAgc2xpY2VfaGVhZChuID0gMjApICU+JSAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNTAgbGluaGFzCiAgc2VsZWN0KDIpICU+JSAgICAgICAgICAgICAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNSBjb2x1bmFzCiAgYXMubWF0cml4KCkKCmNvcnBsb3RfZGltMiA9IHtjb3JycGxvdCh2YXJfb3JkZW5hZG9fdG9wMjBfZGltMiwgCiAgICAgICAgIGlzLmNvcnIgPSBULCB0bC5jb2wgPSAnYmxhY2snLCAKICAgICAgICAgdGwuY2V4ID0gMC41LCAKICAgICAgICAgYWRkQ29lZi5jb2wgPSAnd2hpdGUnLAogICAgICAgICBudW1iZXIuY2V4ID0gMC40LAogICAgICAgICBjbC5wb3MgPSAnbicsIAogICAgICAgICBjb2wgPSAiUHVycGxlIikgOwogICAgICAgICMgQ2FsbCB0aGUgcmVjb3JkUGxvdCgpIGZ1bmN0aW9uIHRvIHJlY29yZCB0aGUgcGxvdAogICAgICAgIHJlY29yZFBsb3QoKQogICAgICAgfQoKZGltMV9kaW0yX2NvcnJwbG90ID0gcGxvdF9ncmlkKGNvcnBsb3RfZGltMSwgY29ycGxvdF9kaW0yLCAKICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsIDAuNSwgMSksIAogICAgICAgICAgYWxpZ24gPSAiaHYiLAogICAgICAgICAgbGFiZWxzID0gYygiRGltMSIsICJEaW0yIiksIAogICAgICAgICAgbnJvdyA9IDEpCgpnZ3NhdmUoZGltMV9kaW0yX2NvcnJwbG90LCBmaWxlID0gImRpbTFfZGltMl9jb3JycGxvdC5wbmciKQoKCiNQbG90CmNvcnJwbG90ID0gZ2djb3JycGxvdChjb3JyX21hdHJpeCwgaGMub3JkZXIgPSBUUlVFKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSA1KSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQojU2FsdmFyCmdnc2F2ZShjb3JycGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3JycGxvdC5wbmciKSwgCiAgICAgICB3aWR0aCA9IDIwLCAjR3JhbmRlIDIwLCBwZXF1ZW5vIDEwCiAgICAgICBoZWlnaHQ9IDIwKSAjR3JhbmRlIDIwLCBwZXF1ZW5vIDEwCnByaW50KGNvcnJwbG90KQoKIyMjIyMjIyMjU2NyZWUgcGxvdApkYXRhLnBjYSA9IHByaW5jb21wKGNvcnJfbWF0cml4KSAjUENBCnN1bW1hcnkoZGF0YS5wY2EpICNSZXRvcm5hciBQQ3MKCiMjIyMjIyMjI1NjcmVlIHBsb3QKc2NyZWVfcGxvdCA9IGZ2aXpfZWlnKGRhdGEucGNhLCAKICAgICAgICAgICAgICAgICAgICAgIGFkZGxhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB5bGltID0gYygwLCA3MCkpICsKICBnZW9tX2NvbChjb2xvciA9ICIjMDBBRkJCIiwgZmlsbCA9ICIjMDBBRkJCIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKI1NhbHZhcgpnZ3NhdmUoc2NyZWVfcGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9zY3JlZXBsb3QucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDMpIApwcmludChzY3JlZV9wbG90KQoKI0NvbXAxLUNvbXAyCmxvYWRpbmdzID0gZGF0YS5mcmFtZShkYXRhLnBjYSRsb2FkaW5nc1ssIDE6M10pCmxvYWRpbmdzJEdlbmVzID0gcm93bmFtZXMobG9hZGluZ3MpCmxvYWRpbmdzXzEgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMSkpCmxvYWRpbmdzXzIgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMikpCmxvYWRpbmdzXzMgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMykpCgojUGxvdApsb2FkaW5nc18xX3Bsb3QgPSBnZ3Bsb3QobG9hZGluZ3NfMSwgYWVzKHggPSByZW9yZGVyKEdlbmVzLCAtQ29tcC4xKSwgeT1Db21wLjEsIGZpbGwgPSBDb21wLjEpKSArIAogIGdndGl0bGUocGFzdGUwKCJDb21wMS1Db21wMiBHZW5lcyIsIGZpbGVuYW1lKSkgKyAKICB5bGFiKCJDb21wMSIpICsKICB4bGFiKCJHZW5lcyIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICB0aGVtZV9saWdodCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuMSwgaGp1c3QgPSAxLCBhbmdsZSA9IDkwLCBzaXplID0gMyksIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikgI2NvcmVzCiAgCiNTYWx2YXIKZ2dzYXZlKGxvYWRpbmdzXzFfcGxvdCwgCiAgICAgICBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX2dlbmVzY29tcDEtMi5wbmciKSwgCiAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQoKcHJpbnQobG9hZGluZ3NfMV9wbG90KQoKZnZpel9jb250cmliKHBjYV9yZXMsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMSwgdG9wID0gMjApCmZ2aXpfY29udHJpYihwY2FfcmVzLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDIwKQpmdml6X2NvbnRyaWIocGNhX3JlcywgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAzLCB0b3AgPSAyMCkKCmZ2aXpfcGNhX2JpcGxvdChwY2FfcmVzLCBzZWxlY3QuaW5kID0gbGlzdChjb250cmliID0gMTApLCAKICAgICAgICAgICAgICAgc2VsZWN0LnZhciA9IGxpc3QoY29udHJpYiA9IDEwKSwKICAgICAgICAgICAgICAgcmVwZWwgPSBUCiAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgoKCmBgYAoKCmBgYHtyfQojIEdyYXBoIG9mIHRoZSB2YXJpYWJsZXMKZnZpel9wY2FfdmFyX2dlbmVzID0gZnZpel9wY2FfdmFyKGRhdGEucGNhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5pbmQgPSAiY29zMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSkKCiNTYWx2YXIKZ2dzYXZlKGZ2aXpfcGNhX3Zhcl9nZW5lcywgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9mdml6X3BjYV92YXJfZ2VuZXMucG5nIiksIHdpZHRoID0gMTApCgojIyMjIyMjIyMgQ09TMgpjb3MyID0gZnZpel9jb3MyKGRhdGEucGNhLCAKICAgICAgICAgICAgICAgICBjaG9pY2UgPSAidmFyIiwgCiAgICAgICAgICAgICAgICAgYXhlcyA9IDE6MikgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDMpKSArCiAgdGhlbWVfbGlnaHQoKQoKI1NhbHZhcgpnZ3NhdmUoY29zMiwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3MyLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQoKI0NvbG9yaWRvCmZ2aXpfcGNhX3ZhcihkYXRhLnBjYSwgY29sLnZhciA9ICJjb3MyIiwKICAgICAgICAgICAgZ3JhZGllbnQuY29scyA9IGMoImJsYWNrIiwgIm9yYW5nZSIsICJncmVlbiIpLAogICAgICAgICAgICByZXBlbCA9IFRSVUUpCgojUHJpbnQKcHJpbnQoZnZpel9wY2FfdmFyX2dlbmVzKQpwcmludChjb3MyKQpgYGAKCiMjIyBCeSBHTyB0ZXJtCgojIyMjIHNzR1NFQQoKClByZXBhcmFyIGRhZG9zCmBgYHtyfQojIElucHV0cwpkYXRhID0gc3Nnc2VhX3Jlc3VsdHNfdW5pZmllZCAlPiUgCiAgIGZpbHRlcighaXMubmEodmFjY2luZSksCiAgICAgICAgICBwcm9jZXNzICE9ICJJTU1VTk9HTE9CVUxJTiBNRURJQVRFRCBJTU1VTkUgUkVTUE9OU0UiKQpkYXRhX2Fubm90YXRpb24gPSBhbm5fdmFjY2luZXNfc2FtcGxlc180XzEyXzIzICU+JSAKICBtdXRhdGUoZGF5ID0gYXMuZmFjdG9yKGRheSksCiAgICAgICAgIGRvc2UgPSBhcy5mYWN0b3IoZG9zZSkpIApmaWxlbmFtZSA9ICJzc2dzZWFfcmVzdWx0c191bmlmaWVkIgoKI0NvbnZlcnRlciBkZSBsb25nIHBhcmEgd2lkZQoKI01hdHJpeiBjb20gYW5vdGHDp8O1ZXMKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXggPSBkYXRhICU+JSAKICBtdXRhdGUocXZhbHVlID0gYXMubnVtZXJpYyhxdmFsdWUpKSAlPiUgCiAgZmlsdGVyKHF2YWx1ZSA8IDAuMTApICU+JSAKICBzZWxlY3Qoc2FtcGxlLCBwcm9jZXNzLCBuZXMpICU+JSAKICBkY2FzdCguLCBgc2FtcGxlYCB+IGBwcm9jZXNzYCwgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJuZXMiLCAKICAgICAgICAgICAgICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JSAKICByZXBsYWNlKC4sIC4gPT0gIk5hTiIsIDApICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIG1lcmdlKGRhdGFfYW5ub3RhdGlvbiwgYnkueCA9ICJzYW1wbGUiLCBieS55ID0gInNhbXBsZSIsIGFsbC54ID0gVCwgYWxsLnkgPSBGKQoKCiNNYXRyaXogcGFyYSBQQ0EKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHkgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCAlPiUKICBzZWxlY3QoIWNvbmRpdGlvbjpwcmV2aW91c192YWNjaW5hdGlvbikgJT4lIAogIGNvbHVtbl90b19yb3duYW1lcygic2FtcGxlIikKCiMgVmVyaWZpcXVlIGNvbHVuYXMgY29tIHZhcmlhbmNpYSBiYWl4YQpuZWFyWmVyb1ZhckNvbHMgPC0gbmVhclplcm9WYXIoYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHksIHNhdmVNZXRyaWNzID0gVFJVRSkKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHkgPC0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHlbLCAhbmVhclplcm9WYXJDb2xzJG56dl0KcGNhX3JlcyA8LSBwcmNvbXAoYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHksIHNjYWxlLiA9IFRSVUUpCgojIENyaWUgbyBncsOhZmljbyBkZSBQQ0EKcGNhX3Bsb3QgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICd2YWNjaW5lJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZT1maWxlbmFtZSkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikKCmdncGxvdGx5KHBjYV9wbG90KQoKIyBFeGliYSBvIGdyw6FmaWNvCnByaW50KHBjYV9wbG90KQpnZ3NhdmUocGNhX3Bsb3QsIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiXyIsICJQQ0FfSW1tdW5lX0dPX0dTRUFfbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKCiMgQ3JpZSBvIGdyw6FmaWNvIGRlIFBDQQoKIyMjIyMjIENvbmRpdGlvbgpwY2FfcGxvdF9jb25kaXRpb24gPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdjb25kaXRpb24nLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDApICsgCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGU9cGFzdGUwKGZpbGVuYW1lLCAiX2J5Y29uZGl0aW9uIikpICsgI3NjYWxlIGZpbGwgbWFudWFsCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpnZ3Bsb3RseShwY2FfcGxvdF9jb25kaXRpb24pCgoKIyMjIyMjIFZhY2NpbmUKcGNhX3Bsb3RfdmFjID0gYXV0b3Bsb3QocGNhX3JlcywgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFubl92YWNjaW5lc19wY2FfbWF0cml4LCAKICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAndmFjY2luZScsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMCkgKyAKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9ieXZhY2NpbmUiKSkgKyAjc2NhbGUgZmlsbCBtYW51YWwKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQkJJQlAiID0gIiNkZWUyZTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQiID0gIiM1NmNmZTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaEFkIiA9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIiA9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTU8iID0gIiNEN0IwRUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJIiA9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSCIgPSAiZ3JleTk1IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIyMjIyMgRGF5CnBjYV9wbG90X2RheSA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2RheScsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMCkgKyAKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9kYXkiKSkgKyAjc2NhbGUgZmlsbCBtYW51YWwKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygKICAgICIwIiA9ICJ3aGl0ZSIsCiAgICAiMSIgPSAiI2NhZjBmOCIsCiAgICAiMiIgPSAiI2FkZThmNCIsCiAgICAiMyIgPSAiIzkwZTBlZiIsCiAgICAiNCIgPSAiIzZDRDVFQSIsCiAgICAiNSIgPSAiIzQ4Y2FlNCIsCiAgICAiNiIgPSAiIzAwYjRkOCIsCiAgICAiNyIgPSAiIzAwOTZjNyIsCiAgICAiMTAiID0gIiMwMDg3QkYiLAogICAgIjE0IiA9ICIjMDA3N2I2IiwKICAgICIyNiIgPSAiIzAxNUJBMCIsCiAgICAiMjgiID0gIiMwMjNlOGEiLAogICAgIjUxIiA9ICIjMDMwNDVlIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIyMjIyMgRG9zZQoKcGNhX3Bsb3RfZG9zZSA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2Rvc2UnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDApICsgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfZG9zZSIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgdmFsdWVzID0gYygiMCIgPSAiI2NhZjBmOCIsIAogICAgICAgICAgICAgICAiMSIgPSAiIzU2Y2ZlMSIsIAogICAgICAgICAgICAgICAiMiIgPSAiIzU5NzhkNCIsCiAgICAgICAgICAgICAgICIzIiA9ICIjYjUxNzllIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIEV4aWJhIG8gZ3LDoWZpY28KcHJpbnQocGNhX3Bsb3RfY29uZGl0aW9uKQpwcmludChwY2FfcGxvdF9kYXkpCnByaW50KHBjYV9wbG90X2Rvc2UpCnByaW50KHBjYV9wbG90X3ZhYykKCmdnc2F2ZShwY2FfcGxvdF9jb25kaXRpb24sIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiQ09ORElUSU9OX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfdmFjLCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9WQUNDSU5FX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfZGF5LCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9EQVlfUENBX0ltbXVuZV9HT19HU0VBX25vdC1hbm4ucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCmdnc2F2ZShwY2FfcGxvdF9kb3NlLCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9ET1NFX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQoKYGBgCgoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyBLTk4gY2xhc3NpZmljYXRpb24KCiNEZXRlcm1pbmFyIG8gbsO6bWVybyBkZSBjbHVzdGVycyBwYXJhIEtOTgpwY2Ffc2NvcmVzIDwtIGRhdGEuZnJhbWUocGNhX3JlcyR4WywgMToyXSkKZnZpel9uYmNsdXN0KHBjYV9zY29yZXMsICAKICAgICAgICAgICAgICAgICAgICAgRlVOY2x1c3RlciA9IGttZWFucywKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIndzcyIpCgpzZXQuc2VlZCg2NjYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBzZWVkIGZvciByYW5kb21pemF0aW9uCmttZWFuc19jbHVzdCA8LSBrbWVhbnMocGNhX3Njb3JlcywgICAgICAgICMgUGVyZm9ybSBrLW1lYW5zIGNsdXN0ZXJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVycyA9IDMpICMgRGVmaW5pciBudW1lcm8gZGUgY2x1c3RlcnMKCiNWaXN1YWxpemFyIGNsdXN0ZXJzCmdncDIgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBrbWVhbnNfY2x1c3QkY2x1c3RlciwKICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJ0IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkgKwogIGdndGl0bGUocGFzdGUwKGZpbGVuYW1lLCAgIl9LTk5fQ2x1c3RlcmVkLnBuZyIpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCnByaW50KGdncDIpCgpnZ3NhdmUoZ2dwMiwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9LTk5fQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCgoKIyBDbHVzdGVyaXphciBwb3IgZ3J1cG8KCiNWYWNjaW5lCnBjYV9ncm91cF92YWMgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCR2YWNjaW5lLAogICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgZWxsaXBzZS50eXBlID0gInQiLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAwKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKSArCiAgZ2d0aXRsZShwYXN0ZTAoZmlsZW5hbWUsICAiX1ZhY19LTk5fQ2x1c3RlcmVkLnBuZyIpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiNEb3NlCnBjYV9ncm91cF9kb3NlIDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgkZG9zZSwKICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJ0IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkgKwogIGdndGl0bGUocGFzdGUwKGZpbGVuYW1lLCAgIl9Eb3NlX0tOTl9DbHVzdGVyZWQucG5nIikpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKI0RheQpwY2FfZ3JvdXBfZGF5IDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgkZGF5LAogICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgZWxsaXBzZS50eXBlID0gInQiLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAwKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKSArCiAgZ2d0aXRsZShwYXN0ZTAoZmlsZW5hbWUsICAiX0RheV9LTk5fQ2x1c3RlcmVkLnBuZyIpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCgojU2FsdmFyCmdnc2F2ZShwY2FfZ3JvdXBfZGF5LCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0RheV9DbHVzdGVyZWQucG5nIiksIHdpZHRoID0gNSwgaGVpZ2h0ID0gNCkKZ2dzYXZlKHBjYV9ncm91cF9kb3NlLCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0Rvc2VfQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCmdnc2F2ZShwY2FfZ3JvdXBfdmFjLCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX1ZhY19DbHVzdGVyZWQucG5nIiksIHdpZHRoID0gNSwgaGVpZ2h0ID0gNCkKYGBgCgoKYGBge3J9CiNCaXBsb3QKYmlwbG90ID0gZnZpel9wY2FfYmlwbG90KHBjYV9yZXMsICAgICAgICAgICAgICAjIFZpc3VhbGl6ZSBjbHVzdGVycyBpbiBiaXBsb3QKICAgICAgICAgICAgICAgICAgICAgIGNvbC52YXIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgYWxwaGEudmFyID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0ga21lYW5zX2NsdXN0JGNsdXN0ZXIsCiAgICAgICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNlLnR5cGUgPSAiY29udmV4IiwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc2l6ZSA9IDMsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJ2YXIiLAogICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJTZXQxIikKCgpnZ3NhdmUoYmlwbG90LCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0JJUExPVF9LTk5fQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpgYGAKCgpgYGB7cn0KIyMjIyMjIyNDb3JyZWxhdGlvbiBwbG90CmNvcnJfbWF0cml4ID0gY29yKGFubl92YWNjaW5lc19wY2FfbWF0cml4X3JlYWR5KSAKCiNQbG90CmNvcnJwbG90ID0gZ2djb3JycGxvdChjb3JyX21hdHJpeCwgaGMub3JkZXIgPSBUUlVFKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSA1KSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQojU2FsdmFyCmdnc2F2ZShjb3JycGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3JycGxvdC5wbmciKSwgCiAgICAgICB3aWR0aCA9IDQsICNHcmFuZGUgMjAsIHBlcXVlbm8gMTAKICAgICAgIGhlaWdodD0gNCkgI0dyYW5kZSAyMCwgcGVxdWVubyAxMApwcmludChjb3JycGxvdCkKZGF0YS5wY2EgPC0gcHJpbmNvbXAoY29ycl9tYXRyaXgpICNQQ0EKc3VtbWFyeShkYXRhLnBjYSkgI1JldG9ybmFyIFBDcwoKCiMjIyMjIyMjI1NjcmVlIHBsb3QKZGF0YS5wY2EgPSBwcmluY29tcChjb3JyX21hdHJpeCkgI1BDQQpzdW1tYXJ5KGRhdGEucGNhKSAjUmV0b3JuYXIgUENzCgojIyMjIyMjIyNTY3JlZSBwbG90CnNjcmVlX3Bsb3QgPSBmdml6X2VpZyhkYXRhLnBjYSwgCiAgICAgICAgICAgICAgICAgICAgICBhZGRsYWJlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgeWxpbSA9IGMoMCwgNzApKSArCiAgZ2VvbV9jb2woY29sb3IgPSAiIzAwQUZCQiIsIGZpbGwgPSAiIzAwQUZCQiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiNTYWx2YXIKZ2dzYXZlKHNjcmVlX3Bsb3QsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfR1NFQV9zY3JlZXBsb3QucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDMpIApwcmludChzY3JlZV9wbG90KQoKCiNTY3JlZSBwbG90CmxvYWRpbmdzID0gZGF0YS5mcmFtZShkYXRhLnBjYSRsb2FkaW5nc1ssIDE6M10pCmxvYWRpbmdzJEdlbmVzID0gcm93bmFtZXMobG9hZGluZ3MpCmxvYWRpbmdzXzEgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMSkpCmxvYWRpbmdzXzIgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMikpCmxvYWRpbmdzXzMgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMykpCgojUGxvdApsb2FkaW5nc18xX3Bsb3QgPSBnZ3Bsb3QobG9hZGluZ3NfMSwgYWVzKHggPSByZW9yZGVyKEdlbmVzLCAtQ29tcC4xKSwgeT1Db21wLjEsIGZpbGwgPSBDb21wLjEpKSArIAogIGdndGl0bGUocGFzdGUwKCJDb21wMS1Db21wMiBHZW5lcyIsIGZpbGVuYW1lKSkgKyAKICB5bGFiKCJDb21wMSIpICsKICB4bGFiKCJHZW5lIHNldHMiKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgdGhlbWVfbGlnaHQoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAxLCBoanVzdCA9IDEsIGFuZ2xlID0gNDUsIHNpemUgPSA4KSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwgaGp1c3QgPSAwLjUpKSArIAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiKSAjY29yZXMKCnByaW50KGxvYWRpbmdzXzFfcGxvdCkKCgpsb2FkaW5nc18yX3Bsb3QgPSBnZ3Bsb3QobG9hZGluZ3NfMiwgYWVzKHggPSByZW9yZGVyKEdlbmVzLCAtQ29tcC4yKSwgeT1Db21wLjIsIGZpbGwgPSBDb21wLjIpKSArIAogIGdndGl0bGUocGFzdGUwKCJDb21wMi1Db21wMyBHZW5lc18iLCBmaWxlbmFtZSkpICsgCiAgeWxhYigiQ29tcDIiKSArCiAgeGxhYigiR2VuZSBzZXRzIikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSwgaGp1c3QgPSAxLCBhbmdsZSA9IDQ1LCBzaXplID0gOCksIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikgI2NvcmVzCgpwcmludChsb2FkaW5nc18yX3Bsb3QpCgoKI1NhbHZhcgpnZ3NhdmUobG9hZGluZ3NfMV9wbG90LCAKICAgICAgIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfR1NFQV9nZW5lc2NvbXAxLTIucG5nIiksIAogICAgICAgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkKCiNTYWx2YXIKZ2dzYXZlKGxvYWRpbmdzXzJfcGxvdCwgCiAgICAgICBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0dTRUFfZ2VuZXNjb21wMi0zLnBuZyIpLCAKICAgICAgIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpCgoKIyBHcmFwaCBvZiB0aGUgdmFyaWFibGVzCmZ2aXpfcGNhX3Zhcl9nZW5lcyA9IGZ2aXpfcGNhX3ZhcihkYXRhLnBjYSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuaW5kID0gImNvczIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IikpCmZ2aXpfcGNhX3Zhcl9nZW5lcwoKZ2dzYXZlKGZ2aXpfcGNhX3Zhcl9nZW5lcywgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9mdml6X3BjYV92YXJfR1NFQS5wbmciKSwgd2lkdGggPSAxMCkKCmNvczIuMSA9IGZ2aXpfY29zMihkYXRhLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxOjIpCmNvczIuMiA9IGZ2aXpfY29zMihkYXRhLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAyOjMpCgpnZ3NhdmUoY29zMi4xLCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX2NvczJfR1NFQV8xLnBuZyIpLCB3aWR0aCA9IDEwKQpnZ3NhdmUoY29zMi4yLCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX2NvczJfR1NFQV8yLnBuZyIpLCB3aWR0aCA9IDEwKQoKYGBgCgojIFBDQSBieSBjb25kaXRpb24KCiMjIyBHU0VBIHRvdGFsCgoKUHJlcGFyYXIgZGFkb3MKYGBge3J9CiMgSW5wdXRzCmRhdGEgPSBhbGxfZGVnc19wXzA1X3ZhY19pbmZlY3RlZF9HU0VBX0FMTF84XzFfMjQgJT4lIAogIHNlbGVjdChjb25kaXRpb24sIHByb2Nlc3MgPSBpZCwgc2V0X3NpemU6cXZhbHVlKSAlPiUgCiAgaW5uZXJfam9pbihhbm5fdmFjY2luZXMsIGJ5ID0gImNvbmRpdGlvbiIpICU+JSAKICAgZmlsdGVyKCFpcy5uYSh2YWNjaW5lKSkKCmRhdGFfYW5ub3RhdGlvbiA9IGFubl92YWNjaW5lcyAlPiUgCiAgbXV0YXRlKHdlZWsgPSBhcy5mYWN0b3Iod2VlayksCiAgICAgICAgIGRvc2UgPSBhcy5mYWN0b3IoZG9zZSkpIAoKZmlsZW5hbWUgPSAiSW1tdW5lX0dPX0dTRUFfIgpgYGAKCgpgYGB7cn0KI0NvbnZlcnRlciBkZSBsb25nIHBhcmEgd2lkZQoKI01hdHJpeiBjb20gYW5vdGHDp8O1ZXMKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXggPSBkYXRhICU+JSAKICBtdXRhdGUocXZhbHVlID0gYXMubnVtZXJpYyhxdmFsdWUpKSAlPiUgCiAgZmlsdGVyKHF2YWx1ZSA8IDAuMTApICU+JSAKICBzZWxlY3QoY29uZGl0aW9uLCBwcm9jZXNzLCBuZXMpICU+JSAKICBkY2FzdCguLCBgY29uZGl0aW9uYCB+IGBwcm9jZXNzYCwgCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJuZXMiLCAKICAgICAgICAgICAgICAgICAgICAgZnVuLmFnZ3JlZ2F0ZSA9IG1lYW4pICU+JSAKICByZXBsYWNlKC4sIC4gPT0gIk5hTiIsIDApICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIG1lcmdlKGRhdGFfYW5ub3RhdGlvbiwgYnkgPSAiY29uZGl0aW9uIiwgYWxsLnggPSBULCBhbGwueSA9IEYpCgojTWF0cml6IHBhcmEgUENBCmFubl92YWNjaW5lc19wY2FfbWF0cml4X3JlYWR5ID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXggJT4lCiAgc2VsZWN0KCF2YWNjaW5lOnByZXZpb3VzX3ZhY2NpbmF0aW9uKSAlPiUgCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjb25kaXRpb24iKQoKIyBWZXJpZmlxdWUgY29sdW5hcyBjb20gdmFyaWFuY2lhIGJhaXhhCm5lYXJaZXJvVmFyQ29scyA8LSBuZWFyWmVyb1Zhcihhbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeSwgc2F2ZU1ldHJpY3MgPSBUUlVFKQphbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeSA8LSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeVssICFuZWFyWmVyb1ZhckNvbHMkbnp2XQpwY2FfcmVzIDwtIHByY29tcChhbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeSwgc2NhbGUuID0gVCkKCiMgQ3JpZSBvIGdyw6FmaWNvIGRlIFBDQQpwY2FfcGxvdCA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ3ZhY2NpbmUnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDApICsgCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHRpdGxlPWZpbGVuYW1lKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiKQoKIyBFeGliYSBvIGdyw6FmaWNvCnByaW50KHBjYV9wbG90KQpnZ3NhdmUocGNhX3Bsb3QsIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiXyIsICJQQ0FfSW1tdW5lX0dPX0dTRUFfbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKCiMjIyMjIyBDb25kaXRpb24KcGNhX3Bsb3RfY29uZGl0aW9uID0gYXV0b3Bsb3QocGNhX3JlcywgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFubl92YWNjaW5lc19wY2FfbWF0cml4LCAKICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnY29uZGl0aW9uJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAxKSArIAogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9ieWNvbmRpdGlvbiIpKSArICNzY2FsZSBmaWxsIG1hbnVhbAogIHNjYWxlX2ZpbGxfY29udGludW91cyh0eXBlID0gInZpcmlkaXMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyMjIyMjIFZhY2NpbmUKI1dpdGhvdXQgdmFsdWVzCnBjYV9wbG90X3ZhYyA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ3ZhY2NpbmUnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDApICsgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfYnl2YWNjaW5lIikpICsgI3NjYWxlIGZpbGwgbWFudWFsCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJCSUJQIiA9ICIjZGVlMmU2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCIgPSAiIzVlNjBjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpGMjAwMSIgPSAiI2I1MTc5ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1PIiA9ICIjRDdCMEVFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSIgPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkgiID0gImdyZXk5NSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQojV2l0aCB2YWx1ZXMKcGNhX3Bsb3RfdmFjX2xhYiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ3ZhY2NpbmUnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDEsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZT0gMywKICAgICAgICAgICAgICAgICAgICBsYWJlbC52anVzdCA9IDAsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwuaGp1c3QgPSAwLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnJlcGVsPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzPUluZikgKyAjTGFiZWwgPSAxIChUUlVFKSAKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9ieXZhY2NpbmUiKSkgKyAjc2NhbGUgZmlsbCBtYW51YWwKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiQkJJQlAiID0gIiNkZWUyZTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQiID0gIiM1NmNmZTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaEFkIiA9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIiA9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTU8iID0gIiNEN0IwRUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJIiA9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSCIgPSAiZ3JleTk1IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIFdFRUsKcGNhX3Bsb3Rfd2VlayA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ3dlZWsnLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IDApICsgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfd2VlayIpKSArICNzY2FsZSBmaWxsIG1hbnVhbAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIxIiA9ICIjY2FmMGY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIgPSAiIzZDRDVFQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gIiMwMDg3QkYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiIzAxNUJBMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3IiA9ICIjMDMwNDVlIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojIERPU0UKCnBjYV9wbG90X2Rvc2UgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdkb3NlJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIGxhYnModGl0bGU9cGFzdGUwKGZpbGVuYW1lLCAiX2Rvc2UiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIjAiID0gIiNjYWYwZjgiLCAKICAgICAgICAgICAgICAgIjEiID0gIiM1NmNmZTEiLCAKICAgICAgICAgICAgICAgIjIiID0gIiM1OTc4ZDQiLAogICAgICAgICAgICAgICAiMyIgPSAiI2I1MTc5ZSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKCgojIyMjIERpc2Vhc2UgdmFjCiNXaXRob3V0IHZhbHVlcwpwY2FfcGxvdF9kaXNlYXNlX3ZhYyA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2Rpc2Vhc2VfdmFjJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIGxhYnModGl0bGU9cGFzdGUwKGZpbGVuYW1lLCAiX2J5dmFjY2luZSIpKSArICNzY2FsZSBmaWxsIG1hbnVhbAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJIIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSIgPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYiID0gIiM1ZTYwY2UiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKI1dpdGggdmFsdWVzCnBjYV9wbG90X2Rpc2Vhc2VfdmFjX2xhYiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2Rpc2Vhc2VfdmFjJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAxLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemU9IDMsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwudmp1c3QgPSAwLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLmhqdXN0ID0gMCwKICAgICAgICAgICAgICAgICAgICBsYWJlbC5yZXBlbD1UUlVFLAogICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz1JbmYpICsgI0xhYmVsID0gMSAoVFJVRSkgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfYnl2YWNjaW5lIikpICsgI3NjYWxlIGZpbGwgbWFudWFsCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkgiID0gIiM1NmNmZTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJIiA9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiViIgPSAiIzVlNjBjZSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKCiMgRXhpYmEgbyBncsOhZmljbwpwcmludChwY2FfcGxvdF9jb25kaXRpb24pCnByaW50KHBjYV9wbG90X3dlZWspCnByaW50KHBjYV9wbG90X2Rvc2UpCnByaW50KHBjYV9wbG90X3ZhYykKcHJpbnQocGNhX3Bsb3RfZG9zZSkKCmdncGxvdGx5KHBjYV9wbG90X3ZhYykKCmdnc2F2ZShwY2FfcGxvdF9jb25kaXRpb24sIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiQ09ORElUSU9OX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfdmFjLCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9WQUNDSU5FX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfdmFjX2xhYiwgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfVkFDQ0lORV9QQ0FfSW1tdW5lX0dPX0dTRUFfYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3Rfd2VlaywgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfV0VFS19QQ0FfSW1tdW5lX0dPX0dTRUFfbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKZ2dzYXZlKHBjYV9wbG90X2Rvc2UsIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiX0RPU0VfUENBX0ltbXVuZV9HT19HU0VBX25vdC1hbm4ucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCmBgYAoKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMgS05OIGNsYXNzaWZpY2F0aW9uCgojRGV0ZXJtaW5hciBvIG7Dum1lcm8gZGUgY2x1c3RlcnMgcGFyYSBLTk4KcGNhX3Njb3JlcyA8LSBkYXRhLmZyYW1lKHBjYV9yZXMkeFssIDE6Ml0pCmZ2aXpfbmJjbHVzdChwY2Ffc2NvcmVzLCAgCiAgICAgICAgICAgICAgICAgICAgIEZVTmNsdXN0ZXIgPSBrbWVhbnMsCiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ3c3MiKQoKc2V0LnNlZWQoNjY2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXQgc2VlZCBmb3IgcmFuZG9taXphdGlvbgprbWVhbnNfY2x1c3QgPC0ga21lYW5zKHBjYV9zY29yZXMsICAgICAgICAjIFBlcmZvcm0gay1tZWFucyBjbHVzdGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcnMgPSAyKSAjIERlZmluaXIgbnVtZXJvIGRlIGNsdXN0ZXJzCgojVmlzdWFsaXphciBjbHVzdGVycwpnZ3AyIDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0ga21lYW5zX2NsdXN0JGNsdXN0ZXIsCiAgICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBlbGxpcHNlLnR5cGUgPSAidCIsCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgIGxhYmVsc2l6ZSA9IDApICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChsYWJlbCA9ICIiKSkpICsKICBnZ3RpdGxlKHBhc3RlMChmaWxlbmFtZSwgICJfS05OX0NsdXN0ZXJlZC5wbmciKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgpwcmludChnZ3AyKQoKZ2dzYXZlKGdncDIsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfS05OX0NsdXN0ZXJlZC5wbmciKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA0KQoKCiMgQ2x1c3Rlcml6YXIgcG9yIGdydXBvCgojVmFjY2luZQpwY2FfZ3JvdXBfdmFjIDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgkdmFjY2luZSwKICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJjb252ZXgiLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAwKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKSArCiAgZ2d0aXRsZShwYXN0ZTAoZmlsZW5hbWUsICAiX1ZhY19LTk5fQ2x1c3RlcmVkLnBuZyIpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiNEb3NlCnBjYV9ncm91cF9kb3NlIDwtIGZ2aXpfcGNhX2luZChwY2FfcmVzLAogICAgICAgICAgICAgICAgICAgaGFiaWxsYWdlID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgkZG9zZSwKICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJjb252ZXgiLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAwKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKSArCiAgZ2d0aXRsZShwYXN0ZTAoZmlsZW5hbWUsICAiX0Rvc2VfS05OX0NsdXN0ZXJlZC5wbmciKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojRGF5CnBjYV9ncm91cF9kYXkgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCRkYXksCiAgICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBlbGxpcHNlLnR5cGUgPSAiY29udmV4IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkgKwogIGdndGl0bGUocGFzdGUwKGZpbGVuYW1lLCAgIl9EYXlfS05OX0NsdXN0ZXJlZC5wbmciKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgoKcHJpbnQocGNhX2dyb3VwX2RheSkKcHJpbnQocGNhX2dyb3VwX2Rvc2UpCnByaW50KHBjYV9ncm91cF92YWMpCgoKI1NhbHZhcgpnZ3NhdmUocGNhX2dyb3VwX2RheSwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9EYXlfQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCmdnc2F2ZShwY2FfZ3JvdXBfZG9zZSwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9Eb3NlX0NsdXN0ZXJlZC5wbmciKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA0KQpnZ3NhdmUocGNhX2dyb3VwX3ZhYywgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9WYWNfQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCmBgYAoKCmBgYHtyfQojQmlwbG90CmJpcGxvdCA9IGZ2aXpfcGNhX2JpcGxvdChwY2FfcmVzLCAgICAgICAgICAgICAgIyBWaXN1YWxpemUgY2x1c3RlcnMgaW4gYmlwbG90CiAgICAgICAgICAgICAgICAgICAgICBjb2wudmFyID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgIGFscGhhLnZhciA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgIGhhYmlsbGFnZSA9IGttZWFuc19jbHVzdCRjbHVzdGVyLAogICAgICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgZWxsaXBzZS50eXBlID0gImNvbnZleCIsCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAzLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAidmFyIiwKICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiU2V0MSIpCgoKZ2dzYXZlKGJpcGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9CSVBMT1RfS05OX0NsdXN0ZXJlZC5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKYGBgCgoKYGBge3J9CiMjIyMjIyMjQ29ycmVsYXRpb24gcGxvdApjb3JyX21hdHJpeCA9IGNvcihhbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeSkgCgojUGxvdApjb3JycGxvdCA9IGdnY29ycnBsb3QoY29ycl9tYXRyaXgsIGhjLm9yZGVyID0gVFJVRSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBzaXplID0gNSksIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkKI1NhbHZhcgpnZ3NhdmUoY29ycnBsb3QsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfY29ycnBsb3QucG5nIiksIAogICAgICAgd2lkdGggPSA0LCAjR3JhbmRlIDIwLCBwZXF1ZW5vIDEwCiAgICAgICBoZWlnaHQ9IDQpICNHcmFuZGUgMjAsIHBlcXVlbm8gMTAKcHJpbnQoY29ycnBsb3QpCmRhdGEucGNhIDwtIHByaW5jb21wKGNvcnJfbWF0cml4KSAjUENBCnN1bW1hcnkoZGF0YS5wY2EpICNSZXRvcm5hciBQQ3MKCgojIyMjIyMjIyNTY3JlZSBwbG90CmRhdGEucGNhID0gcHJpbmNvbXAoY29ycl9tYXRyaXgpICNQQ0EKc3VtbWFyeShkYXRhLnBjYSkgI1JldG9ybmFyIFBDcwoKIyMjIyMjIyMjU2NyZWUgcGxvdApzY3JlZV9wbG90ID0gZnZpel9laWcoZGF0YS5wY2EsIAogICAgICAgICAgICAgICAgICAgICAgYWRkbGFiZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSBjKDAsIDcwKSkgKwogIGdlb21fY29sKGNvbG9yID0gIiMwMEFGQkIiLCBmaWxsID0gIiMwMEFGQkIiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojU2FsdmFyCmdnc2F2ZShzY3JlZV9wbG90LCBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0dTRUFfc2NyZWVwbG90LnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAzKSAKcHJpbnQoc2NyZWVfcGxvdCkKCgojU2NyZWUgcGxvdApsb2FkaW5ncyA9IGRhdGEuZnJhbWUoZGF0YS5wY2EkbG9hZGluZ3NbLCAxOjNdKQpsb2FkaW5ncyRHZW5lcyA9IHJvd25hbWVzKGxvYWRpbmdzKQpsb2FkaW5nc18xID0gYXJyYW5nZShsb2FkaW5ncywgZGVzYyhDb21wLjEpKQpsb2FkaW5nc18yID0gYXJyYW5nZShsb2FkaW5ncywgZGVzYyhDb21wLjIpKQpsb2FkaW5nc18zID0gYXJyYW5nZShsb2FkaW5ncywgZGVzYyhDb21wLjMpKQoKI1Bsb3QKbG9hZGluZ3NfMV9wbG90ID0gZ2dwbG90KGxvYWRpbmdzXzEsIGFlcyh4ID0gcmVvcmRlcihHZW5lcywgLUNvbXAuMSksIHk9Q29tcC4xLCBmaWxsID0gQ29tcC4xKSkgKyAKICBnZ3RpdGxlKHBhc3RlMCgiQ29tcDEtQ29tcDIgR2VuZXMiLCBmaWxlbmFtZSkpICsgCiAgeWxhYigiQ29tcDEiKSArCiAgeGxhYigiR2VuZSBzZXRzIikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSwgaGp1c3QgPSAxLCBhbmdsZSA9IDQ1LCBzaXplID0gOCksIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikgI2NvcmVzCgpwcmludChsb2FkaW5nc18xX3Bsb3QpCgoKbG9hZGluZ3NfMl9wbG90ID0gZ2dwbG90KGxvYWRpbmdzXzIsIGFlcyh4ID0gcmVvcmRlcihHZW5lcywgLUNvbXAuMiksIHk9Q29tcC4yLCBmaWxsID0gQ29tcC4yKSkgKyAKICBnZ3RpdGxlKHBhc3RlMCgiQ29tcDItQ29tcDMgR2VuZXNfIiwgZmlsZW5hbWUpKSArIAogIHlsYWIoIkNvbXAyIikgKwogIHhsYWIoIkdlbmUgc2V0cyIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICB0aGVtZV9saWdodCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDEsIGhqdXN0ID0gMSwgYW5nbGUgPSA0NSwgc2l6ZSA9IDgpLCAKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLCBoanVzdCA9IDAuNSkpICsgCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKHR5cGUgPSAidmlyaWRpcyIpICNjb3JlcwoKcHJpbnQobG9hZGluZ3NfMl9wbG90KQoKCiNTYWx2YXIKZ2dzYXZlKGxvYWRpbmdzXzFfcGxvdCwgCiAgICAgICBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX0dTRUFfZ2VuZXNjb21wMS0yLnBuZyIpLCAKICAgICAgIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpCgojU2FsdmFyCmdnc2F2ZShsb2FkaW5nc18yX3Bsb3QsIAogICAgICAgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9HU0VBX2dlbmVzY29tcDItMy5wbmciKSwgCiAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQoKCiMgR3JhcGggb2YgdGhlIHZhcmlhYmxlcwpmdml6X3BjYV92YXJfZ2VuZXMgPSBmdml6X3BjYV92YXIoZGF0YS5wY2EsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLmluZCA9ICJjb3MyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50LmNvbHMgPSBjKCIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0ZDNEUwNyIpKQpmdml6X3BjYV92YXJfZ2VuZXMKCmdnc2F2ZShmdml6X3BjYV92YXJfZ2VuZXMsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfZnZpel9wY2FfdmFyX0dTRUEucG5nIiksIHdpZHRoID0gMTApCgpjb3MyLjEgPSBmdml6X2NvczIoZGF0YS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMToyKQpjb3MyLjIgPSBmdml6X2NvczIoZGF0YS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMjozKQoKZ2dzYXZlKGNvczIuMSwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3MyX0dTRUFfMS5wbmciKSwgd2lkdGggPSAxMCkKZ2dzYXZlKGNvczIuMiwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3MyX0dTRUFfMi5wbmciKSwgd2lkdGggPSAxMCkKCmBgYAoKCgoKIyMjIEJ5IGdlbmVzCgoKUHJvY2Vzc2FyIGRhZG9zCmBgYHtyfQpJbW11bmVHT19HZW5lcyA9IGFsbF9kZWdzX3BfMDVfdmFjX2luZmVjdGVkXzE5XzEyXzIzICU+JSAKICBzZWxlY3QoLSIuLi4xIikgJT4lIAogIGlubmVyX2pvaW4oSW1tdW5lR09fQW5ub3RhdGVkX0dlbmVzXzhfMV8yNCAlPiUgCiAgICAgICAgICAgICAgIHNlbGVjdChnZW5lcykgJT4lIAogICAgICAgICAgICAgICBkaXN0aW5jdCgpLAogICAgICAgICAgICAgICBieSA9ICJnZW5lcyIpICU+JSAKICBkaXN0aW5jdCgpCgpub25JbW11bmVHT19HZW5lcyA9IGFsbF9kZWdzX3BfMDVfdmFjX2luZmVjdGVkXzE5XzEyXzIzICU+JSAKICBzZWxlY3QoLSIuLi4xIikgJT4lIAogIGFudGlfam9pbihJbW11bmVHT19Bbm5vdGF0ZWRfR2VuZXNfOF8xXzI0ICU+JSAKICAgICAgICAgICAgICAgc2VsZWN0KGdlbmVzKSAlPiUgCiAgICAgICAgICAgICAgIGRpc3RpbmN0KCksCiAgICAgICAgICAgICAgIGJ5ID0gImdlbmVzIikgJT4lIAogIGRpc3RpbmN0KCkKCmFsbF9ub25fSW1tdW5lR09fR2VuZXMgPSBhbGxfZGVnc19wXzA1X3ZhY19pbmZlY3RlZF8xOV8xMl8yMyAlPiUgCiAgc2VsZWN0KC0iLi4uMSIpICU+JSAKICBkaXN0aW5jdCgpCgojSU5QVVQKZGF0YV9nZW5lcyA9IEltbXVuZUdPX0dlbmVzCmZpbGVuYW1lID0gIkltbXVuZUdPX0dlbmVzIgoKZGF0YV9hbm5vdGF0aW9uID0gYW5uX3ZhY2NpbmVzICU+JSAKICBtdXRhdGUoZGF5ID0gYXMuZmFjdG9yKGRheSksCiAgICAgICAgIGRvc2UgPSBhcy5mYWN0b3IoZG9zZSkpIAoKI0NvbnZlcnRlciBkZSBsb25nIHBhcmEgd2lkZQoKI01hdHJpeiBjb20gYW5vdGHDp8O1ZXMKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXggPSBkYXRhX2dlbmVzICU+JSAKICBzZWxlY3QoY29uZGl0aW9uLCBnZW5lcywgbG9nMmZvbGRfY2hhbmdlKSAlPiUgCiAgZGNhc3QoLiwgYGNvbmRpdGlvbmAgfiBgZ2VuZXNgLCAKICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gImxvZzJmb2xkX2NoYW5nZSIsIAogICAgICAgICAgICAgICAgICAgICBmdW4uYWdncmVnYXRlID0gbWVhbikgJT4lIAogIHJlcGxhY2UoLiwgLiA9PSAiTmFOIiwgMCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgbWVyZ2UoZGF0YV9hbm5vdGF0aW9uICU+JSBtdXRhdGUod2VlayA9IGFzLmZhY3Rvcih3ZWVrKSksIGJ5ID0gImNvbmRpdGlvbiIsIGFsbC54ID0gVCwgYWxsLnkgPSBGKQpgYGAKCgpgYGB7cn0KI01hdHJpeiBwYXJhIFBDQQphbm5fdmFjY2luZXNfcGNhX21hdHJpeF9yZWFkeSA9IGFubl92YWNjaW5lc19wY2FfbWF0cml4ICU+JQogIHNlbGVjdCghdmFjY2luZTpwcmV2aW91c192YWNjaW5hdGlvbikgJT4lIAogIGNvbHVtbl90b19yb3duYW1lcygiY29uZGl0aW9uIikKCiMgVmVyaWZpcXVlIGNvbHVuYXMgY29tIHZhcmlhbmNpYSBiYWl4YQpuZWFyWmVyb1ZhckNvbHMgPC0gbmVhclplcm9WYXIoYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHksIHNhdmVNZXRyaWNzID0gVFJVRSkKYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHkgPC0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHlbLCAhbmVhclplcm9WYXJDb2xzJG56dl0KcGNhX3JlcyA8LSBwcmNvbXAoYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXhfcmVhZHksIHNjYWxlLiA9IFQpCgojIENyaWUgbyBncsOhZmljbyBkZSBQQ0EKcGNhX3Bsb3QgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICd2YWNjaW5lJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZT1maWxlbmFtZSkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikKCiMgRXhpYmEgbyBncsOhZmljbwpwcmludChwY2FfcGxvdCkKZ2dzYXZlKHBjYV9wbG90LCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl8iLCAiUENBX0ltbXVuZV9HT19HZW5lc19ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQoKIyBDcmllIG8gZ3LDoWZpY28gZGUgUENBCgojIyMjIyMgQ29uZGl0aW9uCnBjYV9wbG90X2NvbmRpdGlvbiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2NvbmRpdGlvbicsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMCkgKyAKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfYnljb25kaXRpb24iKSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkJJQlAgKFYzLCBEMDcpIiA9ICJncmF5NTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQklCUCAoVjMsIEQxNCkiID0gImdyYXk1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJCSUJQIChWMywgRDI4KSIgPSAiZ3JheTUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMSwgRDYpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMiwgRDEpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMywgRDEpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5ULUkgKEQxKSI9ICIjQkYzMTAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5ULUkgKEQxMCwgbWlsZCkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMTAsIHNldmVyZSkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMikiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMjYsIG1pbGQpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDI2LCBzZXZlcmUpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDMpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDQpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDUxLCBzZXZlcmUpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSS1CTlQgKEQ1MSwgbWlsZCkiPSAiI0Y1QkIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JLUJOVCAoRDUxLCBzZXZlcmUpIj0gIiNGNUJCMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtTU8gKFYxLCBENikiPSAiI0Q3QjBFRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1NTyAoVjMsIEQxKSI9ICIjRDdCMEVFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQzKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQ2KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQ3KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQxKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQzKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQ3KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZC1CTlQgKFYyLCBEMCkiPSAiIzc0MDBiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoQWQtQk5UIChWMiwgRDMpIj0gIiM3NDAwYjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaEFkLUJOVCAoVjIsIEQ3KSI9ICIjNzQwMGI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZC1CTlQgKFYzLCBEMSkiPSAiIzc0MDBiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQxKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDEwLCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQxMCwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDI2LCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQyNiwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDUxLCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQ1MSwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS1CTlQtSSAoRDIpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUJOVC1JIChENSkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkktSSAoRDApIj0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUkgKEQxKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS1JIChEMikiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkktSSAoRDMpIj0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUkgKEQ1KSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDA3KSI9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDE0KSI9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDI4KSIgPSAiI2I1MTc5ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkrCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBWQUxVRVMKcGNhX3Bsb3RfY29uZGl0aW9uX2xhYiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2NvbmRpdGlvbicsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMSwKICAgICAgICAgICAgICAgICAgICBsYWJlbC5zaXplID0gMiwKICAgICAgICAgICAgICAgICAgICBsYWJlbC5yZXBlbCA9IFQpICsgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfYnljb25kaXRpb24iKSkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQkJJQlAgKFYzLCBEMDcpIiA9ICJncmF5NTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQklCUCAoVjMsIEQxNCkiID0gImdyYXk1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJCSUJQIChWMywgRDI4KSIgPSAiZ3JheTUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMSwgRDYpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMiwgRDEpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIChWMywgRDEpIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5ULUkgKEQxKSI9ICIjQkYzMTAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5ULUkgKEQxMCwgbWlsZCkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMTAsIHNldmVyZSkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMikiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JIChEMjYsIG1pbGQpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDI2LCBzZXZlcmUpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDMpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDQpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSSAoRDUxLCBzZXZlcmUpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtSS1CTlQgKEQ1MSwgbWlsZCkiPSAiI0Y1QkIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1JLUJOVCAoRDUxLCBzZXZlcmUpIj0gIiNGNUJCMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCTlQtTU8gKFYxLCBENikiPSAiI0Q3QjBFRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVC1NTyAoVjMsIEQxKSI9ICIjRDdCMEVFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQzKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQ2KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjEsIEQ3KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQxKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQzKSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCAoVjIsIEQ3KSI9ICIjNWU2MGNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZC1CTlQgKFYyLCBEMCkiPSAiIzc0MDBiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoQWQtQk5UIChWMiwgRDMpIj0gIiM3NDAwYjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaEFkLUJOVCAoVjIsIEQ3KSI9ICIjNzQwMGI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZC1CTlQgKFYzLCBEMSkiPSAiIzc0MDBiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQxKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDEwLCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQxMCwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDI2LCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQyNiwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSAoRDUxLCBtb2RlcmF0ZSkiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkgKEQ1MSwgc2V2ZXJlKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS1CTlQtSSAoRDIpIj0gIiNCRjMxMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUJOVC1JIChENSkiPSAiI0JGMzEwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkktSSAoRDApIj0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUkgKEQxKSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS1JIChEMikiPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkktSSAoRDMpIj0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJLUkgKEQ1KSI9ICIjZmY0ZDZkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDA3KSI9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDE0KSI9ICIjYjUxNzllIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWkYyMDAxIChWMywgRDI4KSIgPSAiI2I1MTc5ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkrCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sPSJub25lIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCnBjYV9wbG90X2NvbmRpdGlvbl9sYWIKYGBgCgoKYGBge3J9CiMjIyMjIyBWYWNjaW5lCiNXaXRob3V0IHZhbHVlcwpwY2FfcGxvdF92YWMgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICd2YWNjaW5lJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIGxhYnModGl0bGU9cGFzdGUwKGZpbGVuYW1lLCAiX2J5dmFjY2luZSIpKSArICNzY2FsZSBmaWxsIG1hbnVhbAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJCQklCUCIgPSAiI2RlZTJlNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJOVCIgPSAiIzU2Y2ZlMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoQWQiID0gIiM1ZTYwY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaRjIwMDEiID0gIiNiNTE3OWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNTyIgPSAiI0Q3QjBFRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkiID0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIIiA9ICJncmV5OTUiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKI1dpdGggdmFsdWVzCnBjYV9wbG90X3ZhY19sYWIgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICd2YWNjaW5lJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAxLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemU9IDMsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwudmp1c3QgPSAwLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLmhqdXN0ID0gMCwKICAgICAgICAgICAgICAgICAgICBsYWJlbC5yZXBlbD1UUlVFLAogICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz1JbmYpICsgI0xhYmVsID0gMSAoVFJVRSkgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfYnl2YWNjaW5lIikpICsgI3NjYWxlIGZpbGwgbWFudWFsCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkJCSUJQIiA9ICIjZGVlMmU2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQk5UIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hBZCIgPSAiIzVlNjBjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpGMjAwMSIgPSAiI2I1MTc5ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1PIiA9ICIjRDdCMEVFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSIgPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkgiID0gImdyZXk5NSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBXRUVLCnBjYV9wbG90X3dlZWsgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICd3ZWVrJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAwKSArIAogIGxhYnModGl0bGU9cGFzdGUwKGZpbGVuYW1lLCAiX3dlZWsiKSkgKyAjc2NhbGUgZmlsbCBtYW51YWwKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiMSIgPSAiI2NhZjBmOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIiM2Q0Q1RUEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICIjMDA4N0JGIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiID0gIiMwMTVCQTAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNyIgPSAiIzAzMDQ1ZSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBET1NFCgpwY2FfcGxvdF9kb3NlID0gYXV0b3Bsb3QocGNhX3JlcywgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFubl92YWNjaW5lc19wY2FfbWF0cml4LCAKICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAnZG9zZScsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMCkgKyAKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9kb3NlIikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICB2YWx1ZXMgPSBjKCIwIiA9ICIjY2FmMGY4IiwgCiAgICAgICAgICAgICAgICIxIiA9ICIjNTZjZmUxIiwgCiAgICAgICAgICAgICAgICIyIiA9ICIjNTk3OGQ0IiwKICAgICAgICAgICAgICAgIjMiID0gIiNiNTE3OWUiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCgoKIyMjIyBEaXNlYXNlIHZhYwojV2l0aG91dCB2YWx1ZXMKcGNhX3Bsb3RfZGlzZWFzZV92YWMgPSBhdXRvcGxvdChwY2FfcmVzLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gYW5uX3ZhY2NpbmVzX3BjYV9tYXRyaXgsIAogICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICdkaXNlYXNlX3ZhYycsIAogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gMCkgKyAKICBsYWJzKHRpdGxlPXBhc3RlMChmaWxlbmFtZSwgIl9kaXNlYXNlX3ZhYyIpKSArICNzY2FsZSBmaWxsIG1hbnVhbAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJIIiA9ICIjNTZjZmUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSSIgPSAiI2ZmNGQ2ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYiID0gIiM1ZTYwY2UiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKI1dpdGggdmFsdWVzCnBjYV9wbG90X2Rpc2Vhc2VfdmFjX2xhYiA9IGF1dG9wbG90KHBjYV9yZXMsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCwgCiAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJ2Rpc2Vhc2VfdmFjJywgCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAxLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemU9IDMsCiAgICAgICAgICAgICAgICAgICAgbGFiZWwudmp1c3QgPSAwLAogICAgICAgICAgICAgICAgICAgIGxhYmVsLmhqdXN0ID0gMCwKICAgICAgICAgICAgICAgICAgICBsYWJlbC5yZXBlbD1UUlVFLAogICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz1JbmYpICsgI0xhYmVsID0gMSAoVFJVRSkgCiAgbGFicyh0aXRsZT1wYXN0ZTAoZmlsZW5hbWUsICJfZGlzZWFzZV92YWMiKSkgKyAjc2NhbGUgZmlsbCBtYW51YWwKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSCIgPSAiIzU2Y2ZlMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkiID0gIiNmZjRkNmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWIiA9ICIjNWU2MGNlIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgoKIyBFeGliYSBvIGdyw6FmaWNvCnByaW50KHBjYV9wbG90X2NvbmRpdGlvbikKcHJpbnQocGNhX3Bsb3Rfd2VlaykKcHJpbnQocGNhX3Bsb3RfZG9zZSkKcHJpbnQocGNhX3Bsb3RfdmFjKQpwcmludChwY2FfcGxvdF9kb3NlKQpwcmludChwY2FfcGxvdF9kaXNlYXNlX3ZhYykKcHJpbnQocGNhX3Bsb3RfZGlzZWFzZV92YWNfbGFiKQoKZ2dwbG90bHkocGNhX3Bsb3RfY29uZGl0aW9uX2xhYikKCmdnc2F2ZShwY2FfcGxvdF9jb25kaXRpb24sIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiQ09ORElUSU9OX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfY29uZGl0aW9uX2xhYiwgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJDT05ESVRJT05fUENBX0ltbXVuZV9HT19HU0VBX2Fubi5wbmciKSwgd2lkdGggPSA2LCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfdmFjLCBmaWxlbmFtZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9WQUNDSU5FX1BDQV9JbW11bmVfR09fR1NFQV9ub3QtYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3RfdmFjX2xhYiwgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfVkFDQ0lORV9QQ0FfSW1tdW5lX0dPX0dTRUFfYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQpnZ3NhdmUocGNhX3Bsb3Rfd2VlaywgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfV0VFS19QQ0FfSW1tdW5lX0dPX0dTRUFfbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKZ2dzYXZlKHBjYV9wbG90X2Rvc2UsIGZpbGVuYW1lID0gcGFzdGUwKGZpbGVuYW1lLCAiX0RPU0VfUENBX0ltbXVuZV9HT19HU0VBX25vdC1hbm4ucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCmdnc2F2ZShwY2FfcGxvdF9kaXNlYXNlX3ZhYywgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfRElTRUFTRVZBQ19QQ0FfSW1tdW5lX0dPX0dTRUFfbm90LWFubi5wbmciKSwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCkKZ2dzYXZlKHBjYV9wbG90X2Rpc2Vhc2VfdmFjX2xhYiwgZmlsZW5hbWUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfRElTRUFTRVZBQ19QQ0FfSW1tdW5lX0dPX0dTRUFfYW5uLnBuZyIpLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4KQoKYGBgCgoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyBLTk4gY2xhc3NpZmljYXRpb24KCiNEZXRlcm1pbmFyIG8gbsO6bWVybyBkZSBjbHVzdGVycyBwYXJhIEtOTgpwY2Ffc2NvcmVzIDwtIGRhdGEuZnJhbWUocGNhX3JlcyR4WywgMToyXSkKZnZpel9uYmNsdXN0KHBjYV9zY29yZXMsICAKICAgICAgICAgICAgICAgICAgICAgRlVOY2x1c3RlciA9IGttZWFucywKICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIndzcyIpCgpzZXQuc2VlZCg2NjYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNldCBzZWVkIGZvciByYW5kb21pemF0aW9uCmttZWFuc19jbHVzdCA8LSBrbWVhbnMocGNhX3Njb3JlcywgICAgICAgICMgUGVyZm9ybSBrLW1lYW5zIGNsdXN0ZXJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVycyA9IDMpICMgRGVmaW5pciBudW1lcm8gZGUgY2x1c3RlcnMKCiNWaXN1YWxpemFyIGNsdXN0ZXJzCmdncDIgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBrbWVhbnNfY2x1c3QkY2x1c3RlciwKICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGVsbGlwc2UudHlwZSA9ICJ0IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkgKwogIGdndGl0bGUocGFzdGUwKGZpbGVuYW1lLCAgIl9LTk5fQ2x1c3RlcmVkLnBuZyIpKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCnByaW50KGdncDIpCgpnZ3NhdmUoZ2dwMiwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9LTk5fQ2x1c3RlcmVkLnBuZyIpLCB3aWR0aCA9IDUsIGhlaWdodCA9IDQpCgoKIyBDbHVzdGVyaXphciBwb3IgZ3J1cG8KCiNWYWNjaW5lCnBjYV9ncm91cF92YWMgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCR2YWNjaW5lLAogICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgZWxsaXBzZS50eXBlID0gImNvbnZleCIsCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICJub25lIiwKICAgICAgICAgICAgICAgICAgIGxhYmVsc2l6ZSA9IDApICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChsYWJlbCA9ICIiKSkpICsKICBnZ3RpdGxlKHBhc3RlMChmaWxlbmFtZSwgICJfVmFjX0tOTl9DbHVzdGVyZWQucG5nIikpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKI0Rvc2UKcGNhX2dyb3VwX2Rvc2UgPC0gZnZpel9wY2FfaW5kKHBjYV9yZXMsCiAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBhbm5fdmFjY2luZXNfcGNhX21hdHJpeCRkb3NlLAogICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgZWxsaXBzZS50eXBlID0gImVsbGlwc2UiLAogICAgICAgICAgICAgICAgICAgbGFiZWwgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNpemUgPSAwKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGFiZWwgPSAiIikpKSArCiAgZ2d0aXRsZShwYXN0ZTAoZmlsZW5hbWUsICAiX0Rvc2VfS05OX0NsdXN0ZXJlZC5wbmciKSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCgojV2VlawpwY2FfZ3JvdXBfd2VlayA8LSBmdml6X3BjYV9pbmQocGNhX3JlcywKICAgICAgICAgICAgICAgICAgIGhhYmlsbGFnZSA9IGFubl92YWNjaW5lc19wY2FfbWF0cml4JHdlZWssCiAgICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBlbGxpcHNlLnR5cGUgPSAiY29udmV4IiwKICAgICAgICAgICAgICAgICAgIGxhYmVsID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxhYmVsID0gIiIpKSkgKwogIGdndGl0bGUocGFzdGUwKGZpbGVuYW1lLCAgIl9XZWVrX0tOTl9DbHVzdGVyZWQucG5nIikpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKCnByaW50KHBjYV9ncm91cF93ZWVrKQpwcmludChwY2FfZ3JvdXBfZG9zZSkKcHJpbnQocGNhX2dyb3VwX3ZhYykKCgojU2FsdmFyCmdnc2F2ZShwY2FfZ3JvdXBfd2VlaywgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9XZWVrX0NsdXN0ZXJlZC5wbmciKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA0KQpnZ3NhdmUocGNhX2dyb3VwX2Rvc2UsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfRG9zZV9DbHVzdGVyZWQucG5nIiksIHdpZHRoID0gNSwgaGVpZ2h0ID0gNCkKZ2dzYXZlKHBjYV9ncm91cF92YWMsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfVmFjX0NsdXN0ZXJlZC5wbmciKSwgd2lkdGggPSA1LCBoZWlnaHQgPSA0KQpgYGAKCgpgYGB7cn0KI0JpcGxvdApiaXBsb3QgPSBmdml6X3BjYV9iaXBsb3QocGNhX3JlcywgICAgICAgICAgICAgICMgVmlzdWFsaXplIGNsdXN0ZXJzIGluIGJpcGxvdAogICAgICAgICAgICAgICAgICAgICAgY29sLnZhciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICBhbHBoYS52YXIgPSAwLjUsCiAgICAgICAgICAgICAgICAgICAgICBoYWJpbGxhZ2UgPSBrbWVhbnNfY2x1c3QkY2x1c3RlciwKICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5pbmQgPSBsaXN0KGNvbnRyaWIgPSA2MCksCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QudmFyID0gbGlzdChjb250cmliID0gMTApLAogICAgICAgICAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgYWRkRWxsaXBzZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMywKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gInZhciIpICsKICAgIGdncHVicjo6ZmlsbF9wYWxldHRlKCJqY28iKSAgICAgIyBJbmRpdml1YWwgZmlsbCBjb2xvcgoKCmdnc2F2ZShiaXBsb3QsIGZpbGUgPSBwYXN0ZTAoZmlsZW5hbWUsICJfQklQTE9UX0tOTl9DbHVzdGVyZWQucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCgoKYGBgCgoKYGBge3J9CiMjIyMjIyMjQ29ycmVsYXRpb24gcGxvdAojTWF0cml6CmNvcnJfbWF0cml4ID0gY29yKG1hdHJpeF9kYXRhX3BjYV9yZWFkeSkgCmxpYnJhcnkoImNvcnJwbG90IikKdmFyIDwtIGdldF9wY2FfdmFyKHBjYV9yZXMpCmNvcnJwbG90KHZhciRjb3MyLCBvcmRlciA9ICdBT0UnKQoKIyMjIENvbnRyaWJ1acOnw6NvIGRvcyBnZW5lcyBwcmluY2lwYWlzIHBhcmEgY2FkYSBQQwojIENvbXAxCnZhcl9vcmRlbmFkb190b3AyMF9kaW0xIDwtIHZhciRjb3MyICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhcnJhbmdlKGRlc2MoLlssIDFdKSkgJT4lICAgIyBPcmRlbmFyIHBlbGEgcHJpbWVpcmEgY29sdW5hIGVtIG9yZGVtIGRlY3Jlc2NlbnRlCiAgc2xpY2VfaGVhZChuID0gMjApICU+JSAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNTAgbGluaGFzCiAgc2VsZWN0KDE6MSkgJT4lICAgICAgICAgICAgICAgICAgIyBTZWxlY2lvbmFyIGFzIHByaW1laXJhcyA1IGNvbHVuYXMKICBhcy5tYXRyaXgoKQoKY29ycGxvdF9kaW0xID0ge2NvcnJwbG90KHZhcl9vcmRlbmFkb190b3AyMF9kaW0xLCAKICAgICAgICAgaXMuY29yciA9IFQsIHRsLmNvbCA9ICdibGFjaycsIAogICAgICAgICB0bC5jZXggPSAwLjUsIAogICAgICAgICBhZGRDb2VmLmNvbCA9ICd3aGl0ZScsCiAgICAgICAgIG51bWJlci5jZXggPSAwLjQsCiAgICAgICAgIGNsLnBvcyA9ICduJywgCiAgICAgICAgIGNvbCA9ICJQdXJwbGUiKSAgOwogICAgICAgICMgQ2FsbCB0aGUgcmVjb3JkUGxvdCgpIGZ1bmN0aW9uIHRvIHJlY29yZCB0aGUgcGxvdAogICAgICAgIHJlY29yZFBsb3QoKQogICAgICAgfQoKI0NvbXAyCnZhcl9vcmRlbmFkb190b3AyMF9kaW0yIDwtIHZhciRjb3MyICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBhcnJhbmdlKGRlc2MoLlssIDJdKSkgJT4lICAgIyBPcmRlbmFyIHBlbGEgcHJpbWVpcmEgY29sdW5hIGVtIG9yZGVtIGRlY3Jlc2NlbnRlCiAgc2xpY2VfaGVhZChuID0gMjApICU+JSAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNTAgbGluaGFzCiAgc2VsZWN0KDIpICU+JSAgICAgICAgICAgICAgICAgICMgU2VsZWNpb25hciBhcyBwcmltZWlyYXMgNSBjb2x1bmFzCiAgYXMubWF0cml4KCkKCmNvcnBsb3RfZGltMiA9IHtjb3JycGxvdCh2YXJfb3JkZW5hZG9fdG9wMjBfZGltMiwgCiAgICAgICAgIGlzLmNvcnIgPSBULCB0bC5jb2wgPSAnYmxhY2snLCAKICAgICAgICAgdGwuY2V4ID0gMC41LCAKICAgICAgICAgYWRkQ29lZi5jb2wgPSAnd2hpdGUnLAogICAgICAgICBudW1iZXIuY2V4ID0gMC40LAogICAgICAgICBjbC5wb3MgPSAnbicsIAogICAgICAgICBjb2wgPSAiUHVycGxlIikgOwogICAgICAgICMgQ2FsbCB0aGUgcmVjb3JkUGxvdCgpIGZ1bmN0aW9uIHRvIHJlY29yZCB0aGUgcGxvdAogICAgICAgIHJlY29yZFBsb3QoKQogICAgICAgfQoKZGltMV9kaW0yX2NvcnJwbG90ID0gcGxvdF9ncmlkKGNvcnBsb3RfZGltMSwgY29ycGxvdF9kaW0yLCAKICAgICAgICAgIHJlbF93aWR0aHMgPSBjKDEsIDAuNSwgMSksIAogICAgICAgICAgYWxpZ24gPSAiaHYiLAogICAgICAgICAgbGFiZWxzID0gYygiRGltMSIsICJEaW0yIiksIAogICAgICAgICAgbnJvdyA9IDEpCgpnZ3NhdmUoZGltMV9kaW0yX2NvcnJwbG90LCBmaWxlID0gImRpbTFfZGltMl9jb3JycGxvdC5wbmciKQoKCiNQbG90CmNvcnJwbG90ID0gZ2djb3JycGxvdChjb3JyX21hdHJpeCwgaGMub3JkZXIgPSBUUlVFKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHNpemUgPSA1KSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpKQojU2FsdmFyCmdnc2F2ZShjb3JycGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9jb3JycGxvdC5wbmciKSwgCiAgICAgICB3aWR0aCA9IDIwLCAjR3JhbmRlIDIwLCBwZXF1ZW5vIDEwCiAgICAgICBoZWlnaHQ9IDIwKSAjR3JhbmRlIDIwLCBwZXF1ZW5vIDEwCnByaW50KGNvcnJwbG90KQoKIyMjIyMjIyMjU2NyZWUgcGxvdApkYXRhLnBjYSA9IHByaW5jb21wKGNvcnJfbWF0cml4KSAjUENBCnN1bW1hcnkoZGF0YS5wY2EpICNSZXRvcm5hciBQQ3MKCiMjIyMjIyMjI1NjcmVlIHBsb3QKc2NyZWVfcGxvdCA9IGZ2aXpfZWlnKGRhdGEucGNhLCAKICAgICAgICAgICAgICAgICAgICAgIGFkZGxhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB5bGltID0gYygwLCA3MCkpICsKICBnZW9tX2NvbChjb2xvciA9ICIjMDBBRkJCIiwgZmlsbCA9ICIjMDBBRkJCIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKI1NhbHZhcgpnZ3NhdmUoc2NyZWVfcGxvdCwgZmlsZSA9IHBhc3RlMChmaWxlbmFtZSwgIl9zY3JlZXBsb3QucG5nIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDMpIApwcmludChzY3JlZV9wbG90KQoKI0NvbXAxLUNvbXAyCmxvYWRpbmdzID0gZGF0YS5mcmFtZShkYXRhLnBjYSRsb2FkaW5nc1ssIDE6M10pCmxvYWRpbmdzJEdlbmVzID0gcm93bmFtZXMobG9hZGluZ3MpCmxvYWRpbmdzXzEgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMSkpCmxvYWRpbmdzXzIgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMikpCmxvYWRpbmdzXzMgPSBhcnJhbmdlKGxvYWRpbmdzLCBkZXNjKENvbXAuMykpCgojUGxvdApsb2FkaW5nc18xX3Bsb3QgPSBnZ3Bsb3QobG9hZGluZ3NfMSwgYWVzKHggPSByZW9yZGVyKEdlbmVzLCAtQ29tcC4xKSwgeT1Db21wLjEsIGZpbGwgPSBDb21wLjEpKSArIAogIGdndGl0bGUocGFzdGUwKCJDb21wMS1Db21wMiBHZW5lcyIsIGZpbGVuYW1lKSkgKyAKICB5bGFiKCJDb21wMSIpICsKICB4bGFiKCJHZW5lcyIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICB0aGVtZV9saWdodCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDAuMSwgaGp1c3QgPSAxLCBhbmdsZSA9IDkwLCBzaXplID0gMyksIAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGhqdXN0ID0gMC41KSkgKyAKICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHlwZSA9ICJ2aXJpZGlzIikgI2NvcmVzCiAgCiNTYWx2YXIKZ2dzYXZlKGxvYWRpbmdzXzFfcGxvdCwgCiAgICAgICBmaWxlID0gcGFzdGUwKGZpbGVuYW1lLCAiX2dlbmVzY29tcDEtMi5wbmciKSwgCiAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQoKcHJpbnQobG9hZGluZ3NfMV9wbG90KQoKZnZpel9jb250cmliKHBjYV9yZXMsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMSwgdG9wID0gMjApCmZ2aXpfY29udHJpYihwY2FfcmVzLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDIwKQpmdml6X2NvbnRyaWIocGNhX3JlcywgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAzLCB0b3AgPSAyMCkKCgoKIyBHcmFwaCBvZiB0aGUgdmFyaWFibGVzCmNpcmNsZV9jb250cmliID0gZnZpel9wY2FfdmFyKHBjYV9yZXMsIGNvbC52YXIgPSAiY29zMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50LmNvbHMgPSBjKCIjNENDOUYwIiwgImJsYWNrIiwgIiNGNzI1ODUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnZhcj0gbGlzdChjb3MyID0gMjApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWwgPSBULCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzaXplID0gMykKCmNpcmNsZV9jb250cmliCmdnc2F2ZShjaXJjbGVfY29udHJpYiwgZmlsZSA9ICJjaXJjbGVfY29udHJpYi5wbmciLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCmBgYAo=